方法1:
由於是單鏈表,所以可以用乙個set儲存第乙個的節點,然後遍歷第二個鍊錶,尋找相同的節點,時間複雜度o(mlogm),空間複雜度o(max(m,n)),**
listnode* findfirstcommonnode( listnode* phead1, listnode* phead2)
while(iter2)
return null;
}
方法2:
因為單鏈表,所以如果有公共節點的話,最後肯定會合併起來,形如y,可以用兩個棧分別儲存兩個鍊錶的節點,這樣鍊錶尾部就在棧頂了,然後比較兩個棧的棧頂,如果一樣就都彈出,直到第乙個不一樣的,返回上次彈出的節點。空間複雜度o(m+n),時間複雜度o(max(m,n))。
方法3:
先遍歷一遍,得到兩個鍊錶的長度,然後長的先走差值步,在同步遍歷,即可找到第乙個公共節點(如果有的話)。時間複雜度o(m+n),不需要額外空間
方法4:
用連個游標分別遍歷兩個鍊錶,當遍歷到鍊錶尾部時,轉到另一條鍊錶的頭部。如果兩條鍊錶的長度相同,那麼第一遍到尾部前就能找到第乙個公共節點(如果有的話)。如果兩條鍊錶長度不同,本來在較短鍊錶的游標轉移到較長的鍊錶上,當本來在較長鍊錶上的游標到達尾部並轉到較短鍊錶的時候,兩個游標離尾部的距離相同,所以第二遍一定能找到公共節點(如果有的話)。時間複雜度o(m+n)不需要額外空間,**比3簡潔
**
listnode* findfirstcommonnode( listnode *phead1, listnode *phead2)
return p1;
}
兩個單鏈表第乙個公共結點
基本概念 兩個鍊錶是單鏈表,如果兩個鍊錶有公共節點,那麼這兩個鍊錶從某一節點開始,它們都指向同乙個節點,之後它們所有的節點都是重合的,不可能再出現分叉。所以拓撲形狀看起來是y型。演算法思想 首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個節點。在第二次遍歷的時候,...
兩個單鏈表的相交問題,第乙個公共結點
關於這個問題,有三種思路。第一種是最普通的思路,使用2層迴圈,第一層迴圈遍歷鍊錶a,在每次遍歷到乙個結點時,第二層迴圈遍歷鍊錶b看看有沒有一樣的結點,這個思路比較容易想,但是這個的思路的時間複雜度比較高,如果兩個鍊錶乙個長度m,乙個長度為n,時間複雜度就是o mn 第二種思路需要用到棧,還需要用到單...
兩個單鏈表的第乙個公共節點
題目 求兩個單鏈表的第乙個公共子節點。思路 我們可以先遍歷兩個單鏈表得到長度,然後求得兩個鍊錶長度的差值,然後讓長的那個鍊錶先走到差值長度位置,然後兩個鍊錶再同時遍歷,直到找到第乙個公共節點。struct listnode int getlistlength listnode head return...