赞
踩
我们说的环形链表是类似于下图的环形链表
设我们的环长度为
C
C
C。假定我们慢指针的初始位置是环的入口(比如上图的2),设这个位置为0.
而快指针的初始位置是
A
A
A,
A
∈
[
0
,
C
−
1
]
A \in [0,C-1]
A∈[0,C−1]。
假设慢指针走了K步之后,快慢指针相遇,则慢指针位置:
0
+
K
0+K
0+K,而快指针的位置是
A
+
2
K
A+2K
A+2K.
此时,显然有一个道理,快指针的初始距离加上它的走过的距离超了慢指针走的距离的
n
C
nC
nC.
所以可以得到表达式
(
A
+
2
K
)
−
(
0
+
K
)
=
n
C
(A+2K) - (0+K) = nC
(A+2K)−(0+K)=nC
进一步化简可得
A
+
K
=
n
C
A + K = nC
A+K=nC,我们令
n
=
1
n=1
n=1时,因为
A
∈
[
0
,
C
−
1
]
A \in [0,C-1]
A∈[0,C−1],所以
K
K
K有解,且
K
∈
[
0
,
C
]
K \in[0,C]
K∈[0,C],所以,必定在慢指针运行一圈有相遇。
设链表中环外部分的长度为
a
a
a。
s
l
o
w
slow
slow指针进入环后,又走了
b
b
b的距离与
f
a
s
t
fast
fast 相遇。此时,
f
a
s
t
fast
fast指针已经走完了环的
n
n
n圈,因此它走过的总距离为
a
+
n
(
b
+
c
)
+
b
=
a
+
(
n
+
1
)
b
+
n
c
a+n(b+c)+b=a+(n+1)b+nc
a+n(b+c)+b=a+(n+1)b+nc.
根据题意,任意时刻,
f
a
s
t
fast
fast 指针走过的距离都为
s
l
o
w
slow
slow 指针的 2 倍。因此,我们有
a + ( n + 1 ) b + n c = 2 ( a + b ) ⟹ a = c + ( n − 1 ) ( b + c ) a+(n+1)b+nc=2(a+b) \implies a=c+(n-1)(b+c) a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
有了 a = c + ( n − 1 ) ( b + c ) a=c+(n-1)(b+c) a=c+(n−1)(b+c) 的等量关系,我们会发现:从相遇点到入环点的距离加上 n − 1 n-1 n−1圈的环长,恰好等于从链表头部到入环点的距离。
因此,当发现 s l o w slow slow 与 f a s t fast fast 相遇时,我们再额外使用一个指针 p t r ptr ptr。起始,它指向链表头部;随后,它和 s l o w slow slow 每次向后移动一个位置。最终,它们会在入环点相遇。
LeetCode官方题解
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。