題目:
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭結點head1和head2,這兩個鍊錶可能相交,也可能不相交,請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null。
要求:時間複雜度o(n+m),空間複雜度o(1)。
思路:第一步判斷鍊錶有無環
通過雜湊表
例如:1->2->3->4->5->3,在便利的過程中,檢查1不在雜湊表中,將1加入,再檢查2,加入,一直到5,加入,再到3,3已經在雜湊表中,說明有環,而且3是環的第乙個節點。如果遍歷到最後為空,說明不存在環。
不通過雜湊表
準備乙個快指標和乙個慢指標,快指標一次走兩步,慢指標一次走一步,若快指標為空了,說明一定無環,若快指標和慢指標相遇了,則一定有環。相遇之後,快指標回到頭結點,之後快指標也走一步,當快慢指標再次相遇時即為環的第乙個節點。這是乙個數學證明,可以當作結論,不用去推導。
第二步若兩個鍊錶均無環
用map輔助求解
將head1中的所有節點放入map中,然後遍歷head2,第乙個檢查到head2中節點在map中的即為相交的第乙個節點。
不用map輔助求解
求出head1的長度,和鍊錶1的最後乙個節點,求出head2的長度以及最後乙個節點,先看end1和end2是否相等,若不等,則不可能相交,若相等,則相交,鍊錶1和鍊錶2的長度進行比較,計算差值,長度更長的那個鍊錶先走乙個差值的長度,之後兩個鍊錶一起走,這時一定會一起走到終點,中間若從乙個結點開始相等,則該節點為兩個鍊錶相交的第乙個節點。
乙個鍊錶有環,乙個鍊錶無環
結論就是不可能相交。
兩個有環鏈表
這時會有三種結構,如下圖所示:
我們用head1表示鍊錶1的頭節點,loop1表示鍊錶1入環的第乙個節點,同理head2和loop2。若loop1=loop2為第二種結構,若loop1不等於loop2,讓loop1繼續走,若loop1會等於loop2,說明為第三中結構,若loop1轉回來了還沒遇到loop2為第一種結構。
//主函式
public static node getintersectnode(node head1, node head2)
public static node getloopnode(node head)
n2 = head;
while(n1!=n2)
return n1;
}public static node noloop(node head1, node head2)
node cur1 = head1;
node cur2 = head2;
int n = 0;
while(cur1!=null)
while(cur2!=null)
if(cur1!=cur2)
cur1 = n>0 ? head1 : head2;
cur2 = cur1==head1 ? head2 : head1;
n = math.abs(n);
while(n!=0)
while(cur1!=cur2)
return cur1;
}public static node bothloop(node head1, node loop1, node head2, node loop2)
while(cur2!=loop2)
cur1 = n>0 ? head1 : head2;
cur2 = cur1==head1 ? head2 : head1;
while(n!=0)
while(cur1!=cur2)
return cur1;
} else
return null;
}}
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回 null 即可。如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時...
兩個單鏈表相交的一系列問題
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外空間複雜度...
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度...