尋找兩個鍊錶的相交節點

2021-10-03 23:02:47 字數 2620 閱讀 6188

題目:

單鏈表可能有環,也可能無環.給定兩個單鏈表的頭節點head1和head2,這兩個鍊錶可能相交,也可能不相交.請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null即可.

要求 : 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o(n+m),額外空間複雜度請達到o(1).

解題思路:

這個題可以分為三個題來做.求解此題也是三個步驟.

1-判斷是否有環.

可能兩個都無環,也可能兩個都有環或者乙個有環乙個無環.

2-全部無環找到第乙個交點.

兩個無環單鏈表,如果最後乙個節點不是同乙個節點,則兩個鍊錶一定不相交.

3-全部有環分兩種情況找到第乙個交點.

全部有環相交分為兩種情況:

a-相交之**環

如果兩條鍊錶的入環點相同則為相交**環,求交點的步驟同判斷無環鏈表交點相同.

b-入環之後相交

若鍊錶a入環之後的某乙個點同煉表b的入環點相同,則兩個鍊錶為入環後相交,也就是兩個鍊錶擁有同乙個環但入環點不同.

此種情況返回兩個入環點任意乙個即可.

說明:兩鍊錶乙個有環乙個無環不可能相交

**如下:

package com.lwx.sort;

public class findfirstintersectionnode

public static node getintersectionnode(node head1,node head2)

node loop1 = getloopnode(head1);

node loop2 = getloopnode(head2);

if(loop1 == null && loop2 == null)

if(loop1 != null && loop2 != null)

return null;

} /**

* 兩個有環鏈表求交點

a-相交之**環

如果兩條鍊錶的入環點相同則為相交**環,求交點的步驟同判斷無環鏈表交點相同.

b-入環之後相交

若鍊錶a入環之後的某乙個點同煉表b的入環點相同,則兩個鍊錶為入環後相交,也就是兩個鍊錶擁有同乙個環但入環點不同.

此種情況返回兩個入環點任意乙個即可.

* @param head1

* @param head2

* @param loop1

* @param loop2

* @return

*/public static node bothloop(node head1, node head2,node loop1, node loop2)

while(cur2 != loop2)

cur1 = n > 0 ? head1 : head2;

cur2 = head1 == cur1 ? head2 : head1;

n = math.abs(n);

while(n != 0)

return cur1;

}else

cur1 = cur1.next;

}}

return null;

} /**

* 兩個無環鏈表求交點.

* 若最後乙個節點相同則擁有交點.

* 兩個鍊錶比較一下長度差,長的先走完差值然後兩個鍊錶一同next.第乙個相同的點為交點.

* @param head1

* @param head2

* @return

*/@suppresswarnings("unused")

public static node noloop(node head1, node head2)

node temp2 = head2;

while(temp2 != null)

if(temp1 != temp2)

temp1 = n > 0? head1 : head2;

temp2 = temp1 == head1 ? head2 : head1;

n = math.abs(n);

while(n != 0)

while(temp1 != null)

return temp1;

} /**

* 獲得鍊錶的入環點,無環則返回null

* 兩個指標一快一慢一同遍歷鍊錶.當快指標等於滿指標時,快指標回到開頭開始一步一步走.此時快慢指標再相遇的點就是交點.

* @param head

* @return

*/@suppresswarnings("null")

public static node getloopnode(node head)

node n1 = head.next;

node n2 = head.next.next;

while(n1 != n2)

n1 = n1.next;

n2 = n2.next.next;

} n2 = head;

while(n1 != n2)

return n1; }}

class node

if(this.next == null)else

return this;

}}

求兩個鍊錶的相交節點

編寫乙個程式,找到兩個單鏈表相交的起始節點。輸入 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 8 輸入解釋 相交節點的值為 8 注意,如果兩個...

兩個相交鍊錶

兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1 的長度為n,鍊錶2的長度為m,時間複...

尋找兩個相交鍊錶的第乙個公共節點

尋找兩個鍊錶的第乙個公共節點.cpp defines the entry point for the console application.1.最簡單的方法就是先順序訪問其中乙個鍊錶,在每訪問乙個節點時,都對另外乙個鍊錶進行遍歷,看節點是否相等 直到找到乙個相等的節點位置,如果鍊錶長度分別是m,n...