乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。
思路一:使用一前一後兩個指標,兩個指標相差n步,n代表環中結點的數目,這兩個指標相遇的結點剛好是環的入口。如何得到環中結點的數目?使用一快一慢兩個指標,如果這兩個指標相遇,表明鍊錶中存在環,並且相遇的結點一定在環內,可以從這個結點出發,一邊走一邊計數。
思路二:使用一快一慢一兩個指標,如果兩個指標相遇,將快指標指向鍊錶頭部,慢指標位置不變,快慢指標以相同速率向前走,兩個指標相遇的位置就是環的入口。證明如下:
(證明過程牛客網上搬的,原始鏈結貌似失效了…)
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution:
defentrynodeofloop
(self, phead):
# write code here
if phead:
pslow, pfast = phead, phead
while pfast != none
and pfast.next != none:
pslow = pslow.next
pfast = pfast.next.next
if pslow == pfast:
break
if pfast == none
or pfast.next == none:
return
none
pfast = phead
while pslow != pfast:
pslow = pslow.next
pfast = pfast.next
return pslow
鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...
鍊錶中環的入口結點
題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...
鍊錶中環的入口結點
題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路1 設環中結點數是n,環的入口位置是x 距離起點走多少步 用快慢指標p,q,q移動的速度是p的2倍,當兩個指標相遇時p走的步數是y,q走的步數是2y,q比p多走k個環的距離,即 2y y kn,則y kn。p距離環的入口點的距離為y x,此...