题解 | #链表中环的入口结点#

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

import java.util.*;
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        //快结点走两步,慢结点走一步
        //  a
        //o->o->o->o->o
        //  c   |     |   b
        //      o<-o<-o
        //头结点到环起始点距离为a
        //有个相遇点,从环起始点到这距离为b,再从这转到起始点距离为c
        //环长度为b+c
        //相遇时,慢结点走的距离为a+b
        //快结点走了 a+b+c+b
        //因为快结点一定比慢结点快一倍 a+b+c+b是a+b的2倍,则c=a
        //相遇点到环起始点距离=头结点到环起始点距离
        ListNode quickNode = pHead;
        ListNode slowNode = pHead;
        ListNode meetNode = null;
        while (quickNode != null && slowNode != null) {
            if (quickNode.next != null) {
                quickNode = quickNode.next.next;
            }
            slowNode = slowNode.next;
            if (quickNode == slowNode) {
                //相遇了,记录下相遇的结点
                meetNode = quickNode;
                System.out.println("相遇" + meetNode.val);
                break;
            }
        }
        if (meetNode != null) {
            slowNode = pHead;

            if (meetNode.next == null || slowNode.next == null) {
                return meetNode;
            }
            while (meetNode != slowNode) {
                meetNode = meetNode.next;
                slowNode = slowNode.next;
            }
            return meetNode;
        }

        return null;
    }
}

全部评论

相关推荐

08-06 16:46
门头沟学院 Java
这是正常招聘吗?🙄测评颠得要死&nbsp;真填不下去
鲁大牛:真是个纸张公司。我综测瞎写的还是进笔试了,笔试大部分都空着还是进面试了。一面一口气问了我15道八股文我都答对了,算法也A出来了。结果一面挂了
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
07-16 18:03
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-07 14:45
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务