leetcode 142. 环形链表 II|刷题打卡

154 阅读2分钟

leetcode 142. 环形链表 II|刷题打卡

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

leetcode 142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

进阶:你是否可以使用 O(1) 空间解决此题?

输入

输出

二、思路分析:

  1. 利用双指针的思想
  2. 链表成环的特点:让两个指针p1,p2位于链表起点并同时移动,p1速度快,p2速度慢。若链表成环,则p1和p2一定会相遇。
  3. 链表成环的位置:当p1,p2相遇后,把其中一个指针(p2)放回到链表起点。然后p1,p2同时移动,速度相同。当p1,p2相遇,该节点就是链表成环的节点。

三、AC 代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var detectCycle = function (head) {
    let p1 = head
    let p2 = head

    if (!head || !head.next) return null
    while (p1) {
        p1 = p1.next
        if (!p1) return null
        p1 = p1.next
        if (!p1) return null
        p2 = p2.next
        if (p1 == p2) break
    }
    p2 = head;
    while (1) {
        if (p1 == p2) return p2
        p1 = p1.next
        p2 = p2.next
    }
}

四、总结:

链表成环的位置证明:

当slow 到达成环处时,fast在它的前面a%x处

fast会追上slow 用时 x-a%x

此时slow 走了 x-a%x.

然后fast回到A 以1的速度走a后到达成环处.

此时slow在(x-a%x+a)%x=0 也回到了成环处.

slow fast 相遇 成环处找到.