環形鍊錶II 快慢指標

2021-10-24 01:23:48 字數 2394 閱讀 9712

參考於:

注意要用距離、幾何來理解這道題

使用快慢指標

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