链表寻找环入口
如图所示起点到入口距离为
x
x
x,入口到相遇点距离为
d
1
d1
d1,相遇点到入口距离为
d
2
d2
d2,环的周长为
C
=
d
1
+
d
2
C = d1 + d2
C=d1+d2。
快指针一次走两步,慢指针一次走一步。
相遇时:快指针一共走了
f
a
s
t
l
=
x
+
n
∗
C
+
d
1
fastl = x + n * C + d1
fastl=x+n∗C+d1 步,慢指针一共走了
s
l
o
w
l
=
x
+
m
∗
c
+
d
1
slowl = x + m*c + d1
slowl=x+m∗c+d1步。
f
a
s
t
1
=
2
s
l
o
w
l
fast1 = 2slowl
fast1=2slowl
x
+
n
∗
C
+
d
1
=
2
x
+
2
m
∗
C
+
2
d
1
x + n * C + d1 = 2x + 2 m * C + 2 d1
x+n∗C+d1=2x+2m∗C+2d1
=>
(
n
−
2
m
)
∗
C
=
x
+
d
1
(1)
(n-2m)*C=x+d1 \tag{1}
(n−2m)∗C=x+d1(1)
慢指针再从起点开始走,快指针也与慢指针一起走,每次走一步。
当慢指针走到入口时:
慢指针走了
x
x
x步,快指针走了
f
a
s
t
l
+
x
=
x
+
n
∗
C
+
d
1
+
x
fastl + x = x + n * C + d1 + x
fastl+x=x+n∗C+d1+x步。
带入(1)
x
+
n
∗
C
+
d
1
+
x
=
x
+
n
∗
C
+
(
n
−
2
m
)
∗
C
=
x
+
(
2
n
−
2
m
)
∗
C
x + n*C + d1 + x = x + n * C + (n-2m)*C= x + (2n-2m) * C
x+n∗C+d1+x=x+n∗C+(n−2m)∗C=x+(2n−2m)∗C
也就是
x
x
x加上
(
2
n
−
2
m
)
(2n-2m)
(2n−2m)圈环,所以一定会相遇。