面試題52 兩個鍊錶的第乙個公共節點

2022-03-03 20:05:22 字數 1487 閱讀 3654

輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)

解題思路

上**(c++很香)

法一:暴力列舉

listnode* findfirstcommonnodebl( listnode* phead1, listnode* phead2) 

pnode1 = pnode1->next;

}return nullptr;

}

法二:輔助棧

注意,在判斷棧頂元素的時候,直到棧頂元素不相等時,可能是找到了第乙個相等的節點,也可能是沒有相等的節點。

listnode *findfirstcommonnode(listnode *heada, listnode *headb)

while(q != nullptr)

int sizea = stack_a.size();

int tmp = 0;

while(!stack_a.empty() && !stack_b.empty())

}tmp = sizea - tmp;

p = heada;

while(tmp--)

p = p->next;

return p;

}

法三:雙指標(很妙)

這裡先假設鍊錶a頭結點與結點8的長度 與 鍊錶b頭結點與結點8的長度相等,那麼就可以用雙指標。

初始化:指標ta指向鍊錶a頭結點,指標tb指向鍊錶b頭結點

如果ta == tb, 說明找到了第乙個公共的頭結點,直接返回即可。

否則,ta != tb,則++ta,++tb

所以現在的問題就變成,如何讓本來長度不相等的變為相等的?

假設鍊錶a長度為a, 鍊錶b的長度為b,此時a != b

但是,a+b == b+a

因此,可以讓a+b作為鍊錶a的新長度,b+a作為鍊錶b的新長度。

// 雙指標法

listnode* findfirstcommonnodedouble(listnode* phead1, listnode* phead2)

}// 走到最後是pnode1 == pnode2 == nullptr

// 所以如果有相同的節點,則返回第乙個,如果沒有,就最後返回nullptr

return pnode1;

}

面試題52 兩個鍊錶的第乙個公共節點

題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。有公共節點的兩個鍊錶在公共節點匯合後,後面的節點均相同,為y型。方法一 消除長度差後,兩者到公共節點距離相同。時間複雜度o m n struct listnode class solution return len listnode findfirs...

面試題52 兩個鍊錶的第乙個公共節點

面試題52 兩個鍊錶的第乙個公共節點 題目 輸入兩個鍊錶,找出它們的第乙個公共結點 思路 首先遍歷兩個鍊錶得到它們的長度,比較長短。第二遍,在較長的鍊錶上先走若干步,接著同時在兩個鍊錶上遍歷 找到的第乙個相同的節點就是它們的第乙個公共節點 classlistnode6 publicclassno52...

面試題52 兩個鍊錶的第乙個公共節點

輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式 顯示的,保證傳入資料是正確的 考察點 時間空間複雜度分析 鍊錶程式設計。思路 一開始想到的是遍歷其中一條鍊錶,找到乙個節點,就去另一條鍊錶中去找相同的,這樣的複雜度比較高。所以借用前文的思路,既然是找...