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

举报
JavaEdge 发表于 2021/08/18 22:34:52 2021/08/18
1.5k+ 0 0
【摘要】 解析 先通过快慢指针判断有无环 无环 直接返回null 有环 假设起点到环起点的距离是a,环的长度是k,且此时A、B在距离环起点x距离处相遇。 即慢指针再走x步就到达环的入口,此时slow走过...

解析

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

无环

直接返回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;
    }
}

  
 

文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。

原文链接:javaedge.blog.csdn.net/article/details/119739155

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。