兩個鏈表相交,要求找出第一個相交的節點

《編程之美》裏面有一篇是講如何判斷兩鏈表是否相交,讀後覺得原文太過囉嗦。於是,筆者總結了一下,此類問題可以擴展爲兩大類,分別是:
1、單鏈表與環問題http://blog.csdn.net/liuxialong/archive/2011/06/20/6555850.aspx
2、單鏈表相交與環問題(本文)
給定兩單鏈表A、B,只給出兩頭指針。請問:
1、如何判斷兩單鏈表(無環)是否相交?
有兩種可取的辦法:
(1)人爲構環,將鏈表A的尾節點指向鏈表B,再判斷是否構環成功?從鏈表B的頭指針往下遍歷,如果能夠回到B,則說明相交
(2)判斷兩鏈表最後一個節點是否相同,如果相交,則尾節點肯定是同一節點
2、如何判斷兩單鏈表(不知是否有環)相交?
先判斷是否有環,判斷是否有環可以使用追逐辦法,設置兩個指針,一個走一步,一個走兩步,如果能相遇則說明存在環
(1)兩個都沒環:回到問題1
(2)一個有環,一個沒環:不用判斷了,肯定兩鏈表不相交
(3)兩個都有環:判斷鏈表A的碰撞點是否出現在鏈表B的環中,如果在,則相交。(相交時,環必定是兩鏈表共有的)
3、如何尋找兩相交鏈表(不知是否有環)的第一個相交節點?
同樣,使用追逐辦法先判斷是否存在環,分情況討論
(1)無環:人爲構環,將鏈表A的尾節點指向鏈表B,則構成一個帶環的單鏈表。這個問題就轉換成尋找帶環單鏈表的環入口節點。
解法參考:http://blog.csdn.net/liuxialong/archive/2011/06/20/6555850.aspx
(2)有環:計算出兩鏈表的長度lA、lB,(環的長度和環到入口點長度之和就是鏈表長度)
計算帶環鏈表長度,可參考http://blog.csdn.net/liuxialong/archive/2011/06/20/6555850.aspx
如果lA>lB,則鏈表A指針先走lA-lB,然後鏈表B指針開始走,兩者相遇的點就是相交點
如果lB>lA,則鏈表B指針先走lB-lA,然後鏈表A指針開始走,兩者相遇的點就是相交點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章