找出有環鏈表中環的起始節點

2021-06-21 14:03:30 字數 695 閱讀 5878

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。

例如:

輸入:a->b->c->d->e->c[與前面的c是同乙個節點]

輸出:c

判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標、和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不難,與判斷是否有環類似,用兩個步長分別為1和2的指標遍歷鍊錶,直到兩者相遇,此時慢指標走過的長度就是環的長度。另外相遇後把其中指標重新設定為起始點,讓兩個指標以步長1再走一遍鍊錶,相遇點就是環的起始點。

證明也很簡單,證明如下:

我們注意到第一次相遇時

慢指標走過的路程s1 = 非環部分長度 + 弧a長

快指標走過的路程s2 = 非環部分長度 + n * 環長 + 弧a長

s1 * 2 = s2,可得 非環部分長度 = n * 環長 - 弧a長

讓指標a回到起始點後,走過乙個非環部分長度,指標b走過了相等的長度,也就是n * 環長 - 弧a長,正好回到環的開頭。

listnode *findcyclehead(listnode *head)

if(kp->next==null) return null;

mp=head;

while(kp!=mp)

return kp;

}

找出有環鏈表中環的起點

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...

找出有環單鏈表的入口節點

這個題比較經典 使用兩個指標去解決。乙個快指標,乙個慢指標。快指標每次走兩步,慢指標每次走一步。如果兩個指標相遇,那麼這個鍊錶是有環的。但是關鍵問題是鍊錶環的入口節點在 呢?數學證明貼上來 設定整個鍊錶的節點個數為n,環的節點個數為l,從煉表頭節點到環的入口節點距離為m,下文記作m節點。假設慢指標走...

如何找出有環鏈表的入環點?

1 head到環入口的距離a過長,導致fast節點很早就進入環中了,a還沒進入環中,此時情況 fast節點走了n圈後,a才開始進入到環中,此時n 1圈 2 head節點開始就是環,或者head到環入口的距離a很短,a進入環中了,b還沒走完一圈,此時n 1圈 從上面的分析知道,當fast和slow相遇...