給定乙個煉表頭, 探測其是否有環, 如果沒有返回null, 如果有返回環開始的位置.
環開始的位置定義為被兩個指標指向的位置.
演算法描述:
1. 快慢指標遍歷, 如果到頭說明無環返回null, 如果相遇說明有環, 進入2.
2. 慢指標回到起點, 快慢指標每次移動一格直到相遇, 返回快指標/慢指標.
**:
1class
solution
13 slow =head;
14while (slow !=fast)
18return
slow;19}
20 };
證明: (僅證明有環情況)
我們設非環部分長為d, 環長為c, 快慢指標相遇時慢指標走過的弧長為l
1. 當快慢指標相遇時, 慢指標行進的距離為: d + l
快指標行進的距離為: d + l + n * c
由快慢指標性質可以得到: 2(d + l) = d + l + n * c
d + l = n * c
d = n * c - l
所以, 慢指標: n * c
快指標: 2 * n * c
2. 把慢指標放回起點, 當慢指標到達環的起點時,
慢指標行進的距離為: d
快指標行進的距離為: 2 * n * c + n * c - l
= 3 * n * c - l
= 3 * (n-1) * c + (c - l)
即快指標也正好走完剩餘的弧長. 到達起點. 證畢.
鍊錶系列 鍊錶環相關問題
設定兩個節點 slow fast,若存在環,分別從鍊錶的頭節點出發,乙個每次向後移動一步,另乙個移動兩步,兩個指標移動速度不一樣,如果存在環,那麼兩個指標一定會在環裡相遇。public boolean hascircle node head node slow head node fast head...
LeetCode 141 環形鍊錶 鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。在這裡插入描...
LeetCode 簡單 鍊錶 141 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...