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

2021-10-24 06:47:16 字數 1829 閱讀 2142

【題目】在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null即可。要求:如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到o(n+m),額外空間複雜度請達到o(1)。

先檢視結構是否有環,用hash_set實現,從頭節點開始遍歷鍊錶,查到乙個不在set中的節點就放到set中,查到乙個在set中已經存在的節點,就說明該節點是第乙個入環的節點,返回它,如果遇到空,就說明無環,返回null

那麼不用雜湊表怎麼做呢

準備兩個指標f、s。f一次走兩步,s一次走一步,如果f遇到null了,說明必然無環,如果有環,f和s一定會在環上相遇,相遇的時刻,f回到開頭,讓f調整為一次走一步,s也走一步,它們兩個一定會在第乙個入環節點相遇,這是個玄學(結論啦,是個數學證明),記住就好。

現在解決了鍊錶有無環的問題,就可以開始下一步了,

如果兩個鍊錶都無環,怎麼找到第乙個相交的節點呢?

簡單一點還是先用hash_set,先把第乙個鍊錶放入map裡,然後遍歷鍊錶2,找到的第乙個在map裡的節點,就是第乙個相交的節點,如果遍歷到空,說明不相交

那不用map怎麼做呢,

先遍歷鍊錶1,統計鍊錶1的長度,得到len1,以及鍊錶1的最後乙個節點end1,然後遍歷鍊錶2,得到len2和end2 ,然後判斷年&end1是否等於&end2,如果&end1!=&end2,則這兩個鍊錶不可能相交,如果&end1==&end2,則相交,但未必是第乙個相交的節點

接下來找第乙個相交的節點

舉個例子,如果len1=100,len2==80,哪個先煉表1先走20步,然後鍊錶2和鍊錶1一起走,它兩一定能一起走到第乙個相交的點

這樣就判斷了,兩個無環單鏈表是否相交的問題,

那麼如果乙個單鏈表有環,乙個單鏈表無環,要怎麼判斷是否相交呢?

直接出結論,不可能相交,因為是單鏈表

那如果兩個但鍊錶都有環呢?

兩個鍊錶都有環,有三種拓撲結構

1、各自成環,兩個沒關係,不相交

2、兩個鍊錶先相交,然後共享乙個環

現在只要找到loop1和loop2(第乙個入環節點),就能區分開這幾種情況,

如果&loop1==&loop2,就說明是第二種拓撲

這種情況下,相當於是無環結構相交,上面已經**過了

如果loop1!=loop2,可能是拓撲1,也可能是拓撲3,

那麼怎麼區分這兩種情況呢?

讓loop1繼續走,如果走到底了,還沒遇到loop2,就應該是拓撲1,如果遇到了,就是拓撲3,那麼這個相交節點,就是loop1或者loop2都對

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

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

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

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

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

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