輸入兩個鍊錶,找出它們的第乙個公共結點。
提供兩種解法,都為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...