[路飞]_leetcode_142.环形链表II

397 阅读1分钟

解题思路

题目是求环形链表入环的位置

  1. 首先判断链表是否为环形链表
  2. 接下来再找入环的位置 设:
  • 设链表中环外部分的长度为 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
};