C語言強化(七)鍊錶相交問題 3 判斷鍊錶是否帶環

2021-07-02 02:05:50 字數 1036 閱讀 2968

前兩篇討論的前提都是鍊錶是無環的,但是如果鍊錶有環呢?

顯然,如果鍊錶有環,那麼之前的尋找鍊錶尾結點的函式將陷入死迴圈,之前的演算法也將崩掉。 所以

對於鍊錶相交的問題,首先要判斷的是鍊錶是否有環。

題目給出倆個單向鍊錶的頭指標,比如 h1,h2,判斷這倆個鍊錶是否相交

解題步驟

判斷兩個【無環】鍊錶是否相交

找到兩個【無環】鍊錶的相交結點

判斷鍊錶是否帶環

判斷兩個【有環】鍊錶是否相交

找到兩個【有環】鍊錶的相交結點

思路

用兩個指標,乙個指標步長為1,乙個指標步長為2,若最後相遇,則鍊錶有環

有環 返回兩指標相遇位置

無環 返回null

判斷鍊錶是否帶環的函式:

/**判斷鍊錶是否有環

node 煉表頭指標

方法:用兩個指標,乙個指標步長為1,乙個指標步長為2,若最後相遇,則鍊錶有環

有環 返回兩指標相遇位置

無環 返回null

*/listnode * ifcircle(listnode * node)

};listnode * l1;

/**判斷鍊錶是否有環

node 煉表頭指標

方法:用兩個指標,乙個指標步長為1,乙個指標步長為2,若最後相遇,則鍊錶有環

有環 返回兩指標相遇位置

無環 返回null

*/listnode * ifcircle(listnode * node)

void main()

{ //l1=createlist();

l1=createcirclelist();

l1=ifcircle(l1);

if(l1!=null)

cout<<"兩指標相遇結點為"

Leetcode(鍊錶)相交鍊錶 c

編寫乙個程式,找到兩個單鏈表相交的起始節點。例如,下面的兩個鍊錶 a a1 a2 c1 c2 c3 b b1 b2 b3 在節點 c1 開始相交。注意 如果兩個鍊錶沒有交點,返回 null.在返回結果後,兩個鍊錶仍須保持原有的結構。可假定整個鍊錶結構中沒有迴圈。程式盡量滿足 o n 時間複雜度,且僅...

鏈表面試題 判斷鍊錶是否相交(c語言)

一 問題描述 判斷兩個鍊錶是否相交,若相交返回交點,否則返回空。這裡假設鍊錶不帶環 由上圖我們可以得出鍊錶相交的兩個結論 1.兩鍊錶相交,第乙個相同的結點為鍊錶的交點 2.兩鍊錶相交,從交點向後的所有結點都相同 合二為一 二 解決思路 方法一 直觀法 思路 依次判斷第乙個鍊錶中的每個結點是否在第二個...

C語言 快慢指標 判斷是否是環形的鍊錶

給定乙個有限鍊錶,判斷鍊錶中是否有環。所謂的環 不一定是是最後的指向第乙個節點,也可能是指向中間的節點 快慢指標 判斷是否是迴圈鍊錶 include include typedef struct linkedlist linkedlist linkedlist newnode int num 建立乙...