給定乙個鍊錶,判斷鍊錶中是否有環。環的起點在**,環的大小是多少。若鍊錶沒有環,那當快指標指到nullptr時,表示該鍊錶沒有環。
快指標速度:2
慢指標速度:1
當慢指標走到p2點時,不妨設快指標走到p1點。並設p1與p2間距離為d,
此時可列等式:
慢指標走的距離 * 2 =快指標走的距離
2 ∗k
=k+d
+n∗r
.2*k =k + d+n * r.
2∗k=k+
d+n∗
r.其中n為快指標已經走過環的圈數。
由上式可以推出
k =d
+n∗r
.k = d+n * r.
k=d+n∗
r.由圖中我們可以得知,p1與p2點相距d距離,則快指標追趕上慢指標則需要比慢指標多走(r-d)距離。
由此我們可以列式得出:
相距距離 / 速度差值 = 相距仍需要走的步數
r −d
2−1=
r−d,
.\frac=r-d,.
2−1r−d
=r−
d,.快指標的速度為2,那麼我們就可以得到相遇的點為2(r-d)+d=2r-d,
也就是p3點,該點距離p2點的距離為d,與p1對稱。
推導相遇過程中,我們得到了乙個等式,k=d
+n∗r
.k = d+n * r.
k=d+n∗
r.那麼我們就可以根據這個等式,重新設定兩個指標,速度相同,起點不同, 乙個起點設定在鍊錶的頭結點,而另乙個則設定在相遇結點,根據上述等式,我們可以得知,兩結點相遇的地方就是環的入口點。
得到環的入口點,只需要遍歷一遍環,即可得到環的大小。
leetcode 141題環形鍊錶
你終究會成為你正在成為的人。給定乙個鍊錶,判斷鍊錶中是否有環 public boolean hascycle listnode node set.add node return false 複雜度分析 public boolean hascycle listnode node listnode fa...
leetcode141環形鍊錶 (快慢指標)
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸...
LeetCode 141 設計鍊錶
題目 簡單說下思路 用兩個指標,乙個跑得快,乙個跑得慢 例如乙個每次前進兩步,乙個前進一步 這樣只要快指標不會撞上null 如果遇到了null的情況那麼必然不存在環 快指標肯定會和慢指標碰面 就好像兩個人在環形跑道裡面跑步,同乙個起點起跑,乙個跑得慢乙個跑得快,那麼最後他們肯定還會碰到一起 具體 d...