解题思路
题目是求环形链表入环的位置
- 首先判断链表是否为环形链表
- 接下来再找入环的位置 设:
- 设链表中环外部分的长度为 a
- slow 指针进入环后,又走了 b 的距离与 fast 相遇
- fast 指针已经走完了环的 n 圈
head---a----入口---b---相遇位置
| |
|-----c-------|
slow: a + b fast: a + b + n * (b + c) => a + ( n + 1 ) * b + n * c
由于快指针走的路长是慢指针的2倍:
a + ( n + 1 ) * b + n * c = 2 * ( a + b ) ⟹ a = c + ( n − 1 )( b + c )
我们知道 b + c 是环的长度,约去得:a = c
所以可以知道 起始点到入口得距离 = 相遇位置往后遍历到入口的距离
代码
var detectCycle = function(head) {
if (!head) return null;
let fast = slow = head;
while (fast && fast.next) {
fast = fast.next.next;
slow = slow.next;
// 找到相遇点
if (fast == slow) {
let pre = head
// 找到入口起点位置
while (pre !== slow) {
pre = pre.next;
slow = slow.next;
}
return pre;
}
}
// 不是环形链表
return null
};