投了騰訊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).