一、問題描述:
判斷兩個鍊錶是否相交,若相交返回交點,否則返回空。(這裡假設鍊錶不帶環)
由上圖我們可以得出鍊錶相交的兩個結論:
1.兩鍊錶相交,第乙個相同的結點為鍊錶的交點;
2.兩鍊錶相交,從交點向後的所有結點都相同(合二為一)。
二、解決思路
方法一:直觀法
思路:依次判斷第乙個鍊錶中的每個結點是否在第二個鍊錶中出現。
時間複雜度:o(length(list1)*length(list2))
typedef int datatype;
typedef struct listnode
listnode,*plistnode;
typedef struct linklist
linklist,*plinklist;
**實現:
plistnode crossoflist(plinklist plist1, plinklist plist2)
cur2 = cur2->next;
} cur1 = cur1->next;
} return null;
}
方法二:構造環法思路:找到list1的最後乙個結點,將其next指向list2的表頭。這樣若鍊錶相交則會構成環,不相交的話就不會構成環。
時間複雜度:o(length(h1)+length(h2))
那麼問題就轉換為檢查鍊錶是否帶環的問題:
(1)判斷相交:
我們利用快慢指標的方法,定義兩個指標都指向list1,然後slow指標每次走一步,fast指標每次走兩步。若他們兩可以相遇,則鍊錶有環,否則fast為null時仍未相遇則鍊錶不帶環。
(2)找入口點:
設環周長為r,slow指標走m步,則fast指標走2m步,由此可得:
這裡首先要證明一下,當slow指標進入環後,fast指標與slow指標最多差r-1,fast每次比slow多走一步,最多走r-1次就可以追上slow指標,這時slow指標走了r-1步,所以當slow指標進入環之後,必定再一圈內被fast指標追上。
slow指標: m = a+x (1)
fast指標: 2m = a+x+nr (2)
由(2)-(1)得:m = nr (3)
由(3)和(1)得:a+x = nr (4)
由(4)推出:a = (n-1)r + (r-x)
通過這個式子,我們可以得到從鍊錶開始到環入口點的距離為從交點到環入口點的距離(由圖中?標出)加上環的整數倍。
通過上面的分析:我們可以在煉表頭設乙個指標find,讓find和處在交點處的slow指標每次都各走一步,當find指標與slow指標相遇,則相遇點為環的入口點,即鍊錶的相交點。
**實現:
plistnode crossoflist2(plinklist plist1, plinklist plist2)
cur->next = plist2->phead; //將list1的尾連在list2的頭上
while(fast && fast->next)
return find;
} }return null;
}
方法三:找尾結點法思路:若list1和list2相交,則他們的尾結點必定相同。
此方法可以判斷鍊錶是否相交,但卻不能找出鍊錶的交點。
時間複雜度:o(length(h1)+length(h2))
通過兩個指標直接找到兩個鍊錶的尾結點,然後進行比較就可以了。
這種方法比較簡單,這裡關於此方法就不做過多介紹了。
三、測試:
void test()
cur->next = find(&list1, 2);
printlinklist(&list2);
ret = crossoflist2(&list1, &list2);
if(ret == null)
else
// destorylinklist(&list1);
// destorylinklist(&list2);
}
鏈表面試題 判斷兩個鍊錶是否相交
判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶不帶環 判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶可能帶環 採用對齊的思想。計算兩個鍊錶的長度 l1 l2,分別用兩個指標 p1 p2 指向兩個鍊錶的頭,然後將較長鍊錶的 p1 假設為 p1 向後移動l2 l1個節點,然後再同時向後移動p1 p2,直...
面試題 判斷鍊錶是否相交
今天看了 july的一篇經典文章 程式設計師程式設計藝術 第九章 閒話鍊錶追趕問題 因為現在一直複習資料結構有關鍊錶的演算法,順便總結下,學習下july大牛的判斷鍊錶是否相交。出處 題目 給出兩個單向鍊錶的頭指標,判斷是否相交。下面是july文章上面的解法 分析 這是來自程式設計之美上的微軟亞院的一...
常見鏈表面試題之判斷鍊錶是否相交,並求交點
給定我們兩個鍊錶,在這裡,我們先討論單鏈表不帶環的情況,我們該怎麼判斷它們是否相交?並求出其交點呢。首先我們來分析一下兩個鍊錶相交都有哪幾種情況。第一種就是y型,它們從某乙個節點相交,第二種是v型,它們直到尾節點才相交。下面兩幅圖分別對應兩種情況。1.y型相交 2.v型相交 其實不難發現,如果兩個鍊...