兩個單向鏈表是否相交 匯總


投了騰訊IOS客戶端開發崗,結果面試官大大問了一堆操作系統,數據結構,算法,計算機網絡問題,orz,給大神跪了!最后問大神什么職位,大神說他就是IOS工程師。真服了!當時問了算法,關於鏈表,當時沒想起來,面完之后拿個紙算算,我竟然會。寫下來,mark一下。

 

問題:給出兩個單向鏈表的頭節點,判斷兩個鏈表是否相交,如果相交,請找出相交節點。

這個問題是分好幾種情況的,要分支來判斷:

假定兩個單鏈表分別為鏈表A和鏈表B,則:

1.A無環,B無環,存在以下三種情況:

  (1). (2). (3).

2.A有環,B無環(A無環,B有環亦然),存在一種情況:

               

3.A有環,B有環,則存在三種情況:

  (1). (2). (3).

判斷一個單向是否有環的方法:從該鏈表頭指針開始,設置兩個指針,一個快指針,一個慢指針。快指針每次沿着鏈表走兩個鏈節,慢指針每次沿着鏈表走一個鏈節,當兩個指針指向同一個鏈節時(即兩個指針相等),說明鏈表有環;當快指針指向null時,說明鏈表無環。

對於情況1:

    分別遍歷得到兩個鏈表的長度,並且在遍歷的時候,比較兩個鏈表的終節點,如果不同,則是(2);如果相同,則為(1)或(3).

    對(1)(3),取鏈表節點數的差值,將長鏈表從差值處開始遍歷,短節點從頭結點開始遍歷,比較兩個節點是否相等,不相等繼續向下遍歷,直至相等找到相交節點。

對於情況2:

    直接得出結論,二者不相交。

對於情況3:

    判斷A有環的因為快慢指針指向了同一個節點,記為交點A,B的記為交點B。從交點A放出一個慢指針,每次沿鏈表走一個鏈節;交點B放出一個快指針,每次沿着鏈表走

    兩個鏈節。當兩個指針相交,則說明A、B共用一個環,情形為(2)或(3);當A的慢指針走回交點A,兩個指針仍然沒相交,說明情況為(1).

    對(2)(3),將交點A的next指向null,斷開環路然后按照1(3)中的線性查找方法去找相交節點,一定能找到一個交點C。

    我們將交點A的next復原,從交點C開始遍歷,找到交點C的前節點,讓交點C前節點的next指向null,這個時候能夠找到交點D。當交點C與交點D相同時,為情況(2);不

    相等時為情況(3).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM