給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。
例如:
輸入: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相遇...