LeetCode系列 鍊錶環探測問題II

2022-04-29 17:39:08 字數 791 閱讀 4162

給定乙個煉表頭, 探測其是否有環, 如果沒有返回null, 如果有返回環開始的位置.

環開始的位置定義為被兩個指標指向的位置.

演算法描述:

1. 快慢指標遍歷, 如果到頭說明無環返回null, 如果相遇說明有環, 進入2.

2. 慢指標回到起點, 快慢指標每次移動一格直到相遇, 返回快指標/慢指標.

**:

1

class

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 不作為引數進行傳遞,僅僅是為了標識...