題目:
單鏈表可能有環,也可能無環.給定兩個單鏈表的頭節點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...