面試題41 兩個鍊錶的第乙個公共結點

2021-07-09 07:55:15 字數 840 閱讀 3690

題目:

輸入兩個鍊錶,找出他們的第乙個公共結點。

邊界條件及異常:

有乙個為空

思路:方法一:用hash表來儲存乙個鍊錶的結點,然後順序遍歷另乙個鍊錶,看是否在hash表中有儲存值,有則是第一次出現的結點。

時間複雜度:o(n1+n2)

空間複雜度:o(n1)

方法二:由於兩個鍊錶有公共結點的話,後面部分一定相同,所以可以從鍊錶尾部開始訪問。如何從鍊錶尾部開始訪問呢?用棧來實現。

時間複雜度:o(n1+n2)

空間複雜度:o(n1+n2)

方法三:可以先確定兩個鍊錶的長度,然後從距離鍊錶尾部相同的位置來逐漸比較。

時間複雜度:o(n1+n2)

空間複雜度:o(1)

#include #include #include #include #include #include #include //for hashtable

#include #include #include #include using namespace std;

struct listnode

};int getlistlength(listnode *head)

return count;

}listnode* findfirstcommonnode(listnode *head1, listnode *head2)

else if (length1 < length2)

while (head1 != head2 && head1 && head2)

return head1;

}int main()

面試題37 兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出它們的第乙個公共節點。鍊錶的定義如下 struct listnode int m nkey listnode m pnext 演算法思路 首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個節點。在第二次遍歷的時候,先在較長的節點上走若干步,接...

面試題37 兩個鍊錶的第乙個公共結點

面試題37 兩個鍊錶的第乙個公共結點 題目 輸入兩個鍊錶,找出他們的第乙個公共結點。從定義可以看出,這是單向鍊錶。如果有公共結點,之後他們的所有結點都是重合的,不可能分叉,拓撲形狀像乙個y而不是x。思路1 可以把兩個鍊錶的結點放入兩個棧,這樣兩個鍊錶的尾結點就是棧頂,接下來比較棧頂結點是否相同。直到...

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

題目 輸入兩個鍊錶,找出它們的第乙個公共結點。這一題我考慮的是,先分別求出每個鍊錶的長度,然後用乙個set收集所有的值。因為set中不允許有重複的值。那麼兩個鍊錶的長度和減去set的size就是公共鍊錶的長度,再從頭遍歷下,即可求得。演算法的複雜度是o m lgm n lgn m,n分別為鍊錶的長度...