1:head到環入口的距離a過長,導致fast節點很早就進入環中了,a還沒進入環中,此時情況:fast節點走了n圈後,a才開始進入到環中,此時n>1圈
2:head節點開始就是環,或者head到環入口的距離a很短,a進入環中了,b還沒走完一圈,此時n<1圈
從上面的分析知道,當fast和slow相遇時,slow還沒有走完鍊錶,假設fast已經在環內迴圈了n(1<= n)圈。假設slow走了s步,則fast走了2s步,又由於
fast走過的步數 = s + n*r(s + 在環上多走的n圈,環的長度是r),則有下面的等式:
(1)2*s = s + n * r ;
(2)=> s = n*r
如果假設整個鍊錶的長度是l,入口和相遇點的距離是x(如上圖所示),起點到入口點的距離是a(如上圖所示),則有:
(3) 由(2)推出 a + x = s = n * r;
(4) a + x = (n - 1) * r + r = (n - 1) * r + (l - a) 由環的長度 = 鍊錶總長度 - 起點到入口點的距離求出
(5) a = (n - 1) * r + (l -a -x)
集合式子(5)以及上圖我們可以看出,在步長為2,圈數n=1的時候:從鍊錶起點head開始到入口點的距離a,與從slow和fast的相遇點(如圖)到入口點的距離相等。
因此我們就可以分別用乙個指標(ptr1, prt2),同時從head與slow和fast的相遇點出發,每一次操作走一步,直到ptr1 == ptr2,此時的位置也就是入口點!
到此第二個問題也已經解決。
找出有環鏈表中環的起點
給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...
找出有環鏈表中環的起始節點
給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...
找出有環單鏈表的入口節點
這個題比較經典 使用兩個指標去解決。乙個快指標,乙個慢指標。快指標每次走兩步,慢指標每次走一步。如果兩個指標相遇,那麼這個鍊錶是有環的。但是關鍵問題是鍊錶環的入口節點在 呢?數學證明貼上來 設定整個鍊錶的節點個數為n,環的節點個數為l,從煉表頭節點到環的入口節點距離為m,下文記作m節點。假設慢指標走...