《程式設計之美》裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是:
1、單鏈表與環問題
2、單鏈表相交與環問題(本文)
給定兩單鏈表a、b,只給出兩頭指標。請問:
1、如何判斷兩單鏈表(無環)是否相交?
有兩種可取的辦法:
(1)人為構環,將鍊錶a的尾節點指向鍊錶b,再判斷是否構環成功?從鍊錶b的頭指標往下遍歷,如果能夠回到b,則說明相交
(2)判斷兩鍊錶最後乙個節點是否相同,如果相交,則尾節點肯定是同一節點
2、如何判斷兩單鏈表(不知是否有環)相交?
先判斷是否有環,判斷是否有環可以使用追逐辦法,設定兩個指標,乙個走一步,乙個走兩步,如果能相遇則說明存在環
(1)兩個都沒環:回到問題1
(2)乙個有環,乙個沒環:不用判斷了,肯定兩鍊錶不相交
(3)兩個都有環:判斷鍊錶a的碰撞點是否出現在鍊錶b的環中,如果在,則相交。(相交時,環必定是兩鍊錶共有的)
3、如何尋找兩相交鍊錶(不知是否有環)的第乙個相交節點?
同樣,使用追逐辦法先判斷是否存在環,分情況討論
(1)無環:人為構環,將鍊錶a的尾節點指向鍊錶b,則構成乙個帶環的單鏈表。這個問題就轉換成尋找帶環單鏈表的環入口節點。
解法參考:
(2)有環:計算出兩鍊錶的長度la、lb,(環的長度和環到入口點長度之和就是鍊錶長度)
計算帶環鍊錶長度,可參考
如果la>lb,則鍊錶a指標先走la-lb,然後鍊錶b指標開始走,兩者相遇的點就是相交點
如果lb>la,則鍊錶b指標先走lb-la,然後鍊錶a指標開始走,兩者相遇的點就是相交點
有環單鏈表相交判斷
如何判斷兩個有環單鏈表是否相交?相交的話返回第乙個相交的節點,不想交的話返回空。如果兩個鍊錶長度分別為n和m,請做到時間複雜度o n m 額外空間複雜度o 1 給定兩個鍊錶的頭結點head1和head2 注意,另外兩個引數adjust0和adjust1用於調整資料,與本題求解無關 請返回乙個bool...
兩個單鏈表相交問題
關於兩個鍊錶相交,很容易遷移到好多地方,比如 1.找出兩個鍊錶相交的節點 2.判斷單個鍊錶是否有環等 3.二叉樹當存在父指標的時候,求樹中兩個節點的最近公共祖先 看乙個圖 一下只給出相當一部分思想 方法一 將兩個鍊錶的節點進行hash操作,然後判斷出節點,這種想法是可以的。方法二 當然採用暴力的方法...
每日程式設計21之單鏈表相交,環的相關問題研究
首先如何判斷二個單鏈表是否相交,也就是所謂的y型鍊錶問題。演算法很簡單,只要分別遍歷二個鍊錶,對比二個鍊錶的表尾元素是否相同即可 那麼再進一步,如何找到這二個鍊錶的交匯點。只要在遍歷的時候,記錄2個鍊錶的長度,m,n,假設m n則長度為m的鍊錶先走m n步,然後二個指標同時走,當二個指標第一次相同的...