剑指 Offer II 022. 链表中环的入口节点

Posted JavaEdge.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 022. 链表中环的入口节点相关的知识,希望对你有一定的参考价值。

  点击上方“JavaEdge”,关注公众号

设为“星标”,好文章不错过!

解析

先通过快慢指针判断有无环

无环

直接返回null

有环

假设:

  • 起点到环起点的距离是a

  • 环的长度是k

  • 且此时A、B在距离环起点x距离处相遇

即慢指针再走x步就到达环的入口,此时slow走过的距离

a + nk + (k - x)

快指针走过的距离: 

a + mk + (k - x)

由快慢的定义可知:

a + mk + (k - x) = 2 * (a + nk + (k - x))

化简得:

 a = (m - 2n -1)k + x

可知a为k的整数倍加x,而AB相遇的位置再走x步恰是环入口,所以此时让其中一个指针指向起点,然后同步走,一定能在环入口相遇!

所以可得代码:

package com.javaedge;


/**
 * @author JavaEdge
 * @date 2021/8/17
 */
public class DetectCycle {


    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }


    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        boolean isCircled = false;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                isCircled = true;
                break;
            }
        }
        if (!isCircled) {
            // 无环
            return null;
        }


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

往期推荐

拥抱Kubernetes,再见了Spring Cloud

百度二面:一个线程OOM了,其它线程还能运行吗?

这一次彻底搞懂JDK动态代理

Iterator迭代器到底是什么?

目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群

喜欢文章,点个“在看、点赞、分享”素质三连支持一下~

以上是关于剑指 Offer II 022. 链表中环的入口节点的主要内容,如果未能解决你的问题,请参考以下文章

Java算法题解剑指 Offer II 022. 链表中环的入口节点

剑指offer 55.链表 链表中环的入口结点

剑指offer(五十六)之链表中环的入口结点

剑指OFFER 链表中环的入口结点

剑指offer:链表中环的入口节点

剑指offer-链表中环的入口结点