链表有环找入口节点原理
环形链表入口检测算法数学解释
数学原理
-
假设定义:
- 链表头到环入口的距离为
a
- 环入口到相遇点的距离为
b
- 相遇点到环入口的距离为
c
- 环的长度为
b + c
- 链表头到环入口的距离为
-
第一次相遇时:
- 慢指针走了
s = a + b
步 - 快指针走了
f = a + b + n(b + c)
步,其中n
是快指针在环内转的圈数 - 由于快指针速度是慢指针的2倍,所以
f = 2s
- 慢指针走了
-
代入求解:
2(a + b) = a + b + n(b + c) a + b = n(b + c) a = n(b + c) - b a = (n-1)(b + c) + c
-
关键结论:
- 当 n=1 时,
a = c
- 这意味着:从链表头到环入口的距离 = 从相遇点继续走到环入口的距离
- 当 n=1 时,
当n不等于1时
您提出了一个很好的问题!我们确实不知道具体的 n 值(快指针绕环的圈数)。让我更清晰地解释:当入口节点很远,可能快指针早就到达环而且转了好几圈了
为什么 n 的具体值不重要
-
我们证明了:
a = (n-1)(b+c) + c
,其中 a 是头到环入口的距离,b+c 是环的周长。 -
关键点:无论 n 是多少(1, 2, 3…),等式右边
(n-1)(b+c) + c
都表示:- 先在环上走 n-1 个完整的圈(即 (n-1)(b+c))
- 再从相遇点继续走 c 步
-
这意味着:从相遇点走 c 步(可能再加上若干个环的周长)一定会到达环入口。
-
同样,从链表头走 a 步也会到达环入口。
-
由于
a = (n-1)(b+c) + c
,如果同时:- 从链表头开始走
- 从相遇点开始走
- 都用相同的速度(每次走1步)
那么这两个指针会同时到达环入口!
-
一个放到头节点走到入口节点 另一个从相遇点走到入口节点在转了几个整圈
实际上 n 的值怎么确定
在实际的链表环检测中,n 值由快慢指针首次相遇时决定,但我们不需要计算它:
- 在标准链表(环不会特别大)中,通常 n=1。
- 即使 n>1,算法也能正确工作:
- 快指针在相遇时可能多走了几圈
- 但在第二阶段,从相遇点出发的指针会沿着相同的路径(可能走几圈)最终到达入口