參考於:
注意要用距離、幾何來理解這道題
使用快慢指標
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
detectcycle
(self, head: listnode)
-> listnode:
if head ==
none
:return
none
slow = head
fast = head
while fast.
next
and fast.
next
.next
: slow = slow.
next
fast = fast.
next
.next
if slow == fast:
break
ifnot fast.
next
ornot fast.
next
.next
:return
none
count2 =
0 fast = head
while fast != slow:
fast = fast.
next
slow = slow.
next
count2 +=
1# 求環的大小
# f = fast
# s = slow
# c = 0
# while f.next and f.next.next:
# f = f.next.next
# s = s.next
# c += 1
# if s == f:
# print(c)
# break
return fast
class
solution
:def
detectcycle
(self, head: listnode)
-> listnode:
ifnot head:
return
none
fast = head
slow = head
while fast.
next
and fast.
next
.next
: slow = slow.
next
fast = fast.
next
.next
if slow == fast:
break
ifnot fast.
next
ornot fast.
next
.next
:return
none
fast = head
while fast != slow:
fast = fast.
next
slow = slow.
next
return slow
把關鍵的點,記錄一下:
快指走過的路程是環形周長的整數倍,f= n*r
這點比較關鍵
另外,但慢指標走過的路程為(n*r+k)
時,指標的位置一定處於環形的入口處
關於環中相遇的位置:
但慢指標剛好到達環的入口時,s距離f的距離為δ
x\delta x
δx,那麼相遇的位置會是對稱的y位置,解釋如下:當他們相遇時,f要比s多走r−δ
xr-\delta x
r−δx
, 設時間為t,2t−
t=r−
δx2t-t =r-\delta x
2t−t=r
−δx, t=r
−δxt = r-\delta x
t=r−δx
, 因此相遇的位置是:對於s0+r
−δx0+r-\delta x
0+r−δx
即 對稱的位置yyy。
環形鍊錶II(快慢指標)
題目 題解 假設該表是環形鍊錶,鏈式部分長度為a aa,環形部分長度為b bb。定義快指標fas tfast fast 和慢指標slo wslow slow 先讓fas tfast fast 每次走兩步,slo wslow slow 每次走一步,直到兩者相遇 接著讓fas tfast fast 重置...
460 快慢指標解環形鍊錶 II
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允許修改給定...
環形鍊錶(快慢指標法)
給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...