【題目】編寫乙個程式,找到兩個單鏈表相交的起始節點。(easy)
例如以下示例中 a 和 b 兩個鍊錶相交於 c1:
a: a1 → a2
↘c1 → c2 → c3
↗b: b1 → b2 → b3
但是因為單鏈表的每個節點只有乙個next指標,即只能有乙個後繼結點。而不會出現下圖結點c有兩個後繼結點。即只要兩個單鏈表相交,必會出現交點,且交點及以後的鍊錶完全重合。
a: a1 → a2 d1 → d2
↘ ↗
c↗ ↘
b: b1 → b2 → b3 e1 → e2
【要求】時間複雜度o(n),空間複雜度o(1),不存在交點則返回null.
【解法1】
鍊錶a和鍊錶b的長度可能不同,但鍊錶a+b長度等於b+a,所以遍歷a+b和遍歷b+a一定會同時結束。
設a的長度為a + c,b的長度為b+ c,c為公共部分。當訪問鍊錶a的指標訪問到表尾時,令它從鍊錶b開始訪問;同樣另一指標從鍊錶b頭部開始訪問到鍊錶尾部時,開始訪問鍊錶a,所以兩個遍歷的指標一定會同時到達交點。
如果a,b不相交的話兩個指標就會同時到達a+b(b+a)的尾節點。
public listnode getintersectionnode
(listnode heada, listnode headb)
listnode pa = heada;
listnode pb = headb;
while
(pa!=pb)
return pa;
}//時間複雜度o(n),空間複雜度o(1)
【解法2】
假設兩個鍊錶如果長度相同,那麼從各自頭結點出發,一次走一步,必會同時到達相交結點。但是鍊錶的長度有可能不一樣,所以若是能消除兩個鍊錶的長度差,讓長鍊錶指標先走(消除長度差),再兩個指標一起走,那必會同時到達相交結點。
//法二:快慢指標+兩個鍊錶長度差值
public listnode getintersectionnode
(listnode heada, listnode headb)
listnode cur1 = heada;
listnode cur2 = headb;
int n=0;
//兩個鍊錶長度的差值
while
(cur1!=null)
while
(cur2!=null)
if(cur1!=cur2)
//定位長表為cur1,短表為cur2
cur1 = n >
0? heada:headb;
cur2 = cur1 == heada ? headb:heada;
n = math.
abs(n)
;while
(n!=0)
while
(cur1!=cur2)
return cur1;
//時間複雜度o(n),空間複雜度o(1)
}
160 相交鍊錶 leetcode
編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3輸出 reference of the node with value...
leetcode 鍊錶 160 相交鍊錶
leetcode鍊錶專題 160 相交鍊錶 輸入兩個鍊錶,找出它們的第乙個公共節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference o...
160 相交鍊錶
編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the node with valu...