Leetcode鍊錶 160 相交鍊錶

2021-10-20 17:11:56 字數 1587 閱讀 6220

【題目】編寫乙個程式,找到兩個單鏈表相交的起始節點。(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...