這個題比較經典 ,使用兩個指標去解決。乙個快指標,乙個慢指標。快指標每次走兩步,慢指標每次走一步。如果兩個指標相遇,那麼這個鍊錶是有環的。但是關鍵問題是鍊錶環的入口節點在**呢?
數學證明貼上來:設定整個鍊錶的節點個數為n,環的節點個數為l,從煉表頭節點到環的入口節點距離為m,下文記作m節點。
假設慢指標走了k步之後兩個節點相遇,將相遇的節點記作k節點。可以證明 0<=k<=n,(慢指標入環的時候,相對於快指標處於靜止,快指標相對於慢指標的速度為1,所以快指標最壞情況下用l-1的步數就可以追上慢指標),而快指標走了2*k的步數。
可以得知2*k-k=x*l(1) 這一點很好理解,從快指標第一次到達k節點,到後來快指標與慢指標相遇在k節點,中間的過程就是一直在環中繞圈,x為快指標在和慢指標相遇之前繞圈的次數。x是乙個整數。可以得到k=x*l ,推理出k是l的整數倍。ps:特別注意k代表的是慢指標與快指標第一次相遇走的步數 而k節點只是乙個名稱。而m是煉表頭節點到環的入口節點的步數
提出第二個問題 那麼此時 k節點與環的入口m節點有幾步的距離呢?
最後貼上**便於理解
/*** definition for singly-linked list.
* class listnode
* }*/
public class solution
if(slow==null||fast==null||fast.next==null) return null;
//如果找到了相遇的點 假設slow指標走了 k步 那麼 slow指標指向的節點 就是我們的 k 節點
listnode first=head; //這就是我們的 j 節點
while(first!=slow)
return first;}}
找出有環鏈表中環的起始節點
給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...
找出有環鏈表中環的起點
給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...
如何找出有環鏈表的入環點?
1 head到環入口的距離a過長,導致fast節點很早就進入環中了,a還沒進入環中,此時情況 fast節點走了n圈後,a才開始進入到環中,此時n 1圈 2 head節點開始就是環,或者head到環入口的距離a很短,a進入環中了,b還沒走完一圈,此時n 1圈 從上面的分析知道,當fast和slow相遇...