找出有环链表中环的入口 | 刷题打卡

100 阅读1分钟

接上一篇『判断链表是否有环』的文章,如果链表中有环,那么该怎样找出环的入口呢?

题目描述

对于一个给定的链表,返回环的入口节点,如果没有环,返回null

问题分析

题目如果链表中有环,那么快慢指针最终会相遇,根据相遇点,可以找出环的入口节点,具体可参考下图

AC代码

function detectCycle( head ) {
    // write code here
    if (head == null || head.next == null) return null;
    let slow = head, fast = head;

    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        if (fast == slow) break;
    }

    if (fast == null || fast.next == null) return null;
    fast = head;

    while (fast != slow) {
        fast = fast.next;
        slow = slow.next;
    }

    return fast;
}

总结

链表是否有环以及找出环的入口节点,最重要的是要理解为什么快慢指针可以解决,要自己推导一下推理过程,深刻理解,才算是掌握这道题目

如果这篇文章对你有帮助,请点赞+关注吧 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情