兩個單鏈表相交的一系列問題

2021-09-25 20:19:09 字數 1915 閱讀 2920

題目:

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭結點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,時間複雜度...