程式設計之美 判斷兩鍊錶是否相交

2021-08-04 17:27:34 字數 861 閱讀 3745

《程式設計之美》裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是:

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指標開始走,兩者相遇的點就是相交點

鍊錶有環否 也可參考此處  是否有環

程式設計之美 判斷兩鍊錶是否相交

程式設計之美 裡面有一篇是講如何判斷兩鍊錶是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴充套件為兩大類,分別是 1 單鏈表與環問題 2 單鏈表相交與環問題 本文 給定兩單鏈表a b,只給出兩頭指標。請問 1 如何判斷兩單鏈表 無環 是否相交?有兩種可取的辦法 1 人為構環,將鍊...

程式設計之美 判斷兩個鍊錶是否相交

首先,判斷乙個鍊錶是否有環?對於這個問題 可以用兩個指標,剛開始都指向頭節點,然後乙個指標每次向後移一步,另乙個指標每次向後移兩步,如果最後移兩步的指標為空時,說明無環,如果最後兩個指標相等,說明有環。如果把第一指標看成靜止,則相當於第二個每次走一步,所以在那個環上時,是一定能相遇的。如何找到這個鍊...

程式設計之美 鍊錶是否相交

個人認為,演算法永遠是王道。此處將擷取程式設計之美這本書上經典的演算法題,以饗各位。同時,除了旁徵博引之外,也會加入我個人的思考。所寫之處,望不吝賜教。july 2010年10月。1.程式設計判斷倆個鍊錶是否相交 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假...