33 兩個鍊錶的第乙個公共結點

2021-08-17 21:54:17 字數 1066 閱讀 7413

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

提供兩種解法,都為o(m+n)的時間複雜度。

前提:因為為普通鍊錶,若兩個鍊錶有交點,從該交點開始,後面的節點都是公共的。

即有交點的話,兩條鍊錶形成y形, 而不是x形。

(一)假設鍊錶1為a-b-c-d-e-null, 鍊錶2為f-g-e-null.分別遍歷兩個新的組合遍歷

(鍊錶1+鍊錶2 : a-b - c -   d  - e - null- f - g - e - null) 

(鍊錶2+鍊錶1 : f- g - e -null-a-    b   - c - d - e - null)

我們可以發現,第乙個相同位置的交點為e,即為 第乙個公共交點。

**如下:

但是注意在(node1==null)?這個判斷中,不能改為(node1->next==null)?會導致在無交點情況死迴圈,無法結束。

假設:鍊錶1:abcde 鍊錶2:fg  即該寫法遍歷的方式為

(abcdefg  fg  fg....)

(fgabcde  abcde  abcde....)

listnode* findfirstcommonnode( listnode* phead1, listnode* phead2) 

return node1;

}

(二)

先各自遍歷兩個鍊錶得到兩個鍊錶長度len1和len2. 讓長的鍊錶從頭開始先前移abs(len2-len1)

然後一起移動兩個節點,比較是否相同,若有交點,則返回第乙個交點,若無則最後在null處匯集。

**如下:

listnode* findfirstcommonnode( listnode* phead1, listnode* phead2) 

while(node2->next!=null)

node1 = phead1;

node2 = phead2;

if(len1>len2)//鍊錶1長

}else//鍊錶2長

}return node1;

}

兩個鍊錶的第乙個公共結點

思路 獲取兩個鍊錶的長度,求的長度差n,讓長鍊表先遍歷n次,然後長鍊表和短鍊錶同時遍歷,當長鍊錶和短鍊錶相等時,即為第一公共結點。o m1 m2 public class findfirstcomnode int len1 getnodelength root1 int len2 getnodele...

兩個鍊錶的第乙個公共結點

題目 輸入兩個鍊錶,找出他們的第乙個公共結點。方法1 分別把兩個鍊錶的節點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。時間和空間複雜度都是o m n 方法2 先遍歷兩個鍊錶得到它們的長度...

兩個鍊錶的第乙個公共結點

輸入兩個鍊錶,找出它們的第乙個公共結點。分析 如果兩個單向鍊錶有公共的結點,那麼這兩個鍊錶從某乙個結點開始,他們的next結點都指向同乙個結點,但由於是單向鍊錶的結點,每個結點都只有乙個next結點,因此從第乙個公共結點開始,之後他們所有結點都是重合的,不可能出現分支。public listnode...