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

链表中环的入口结点

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

/*
 public class ListNode {
    int val;
    ListNode next = null;

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

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        ListNode slow1 = hasCycle(pHead);
        //神奇的算法:
        //当找到快慢指针第一次相遇的节点后,保存在slow1
        //创建出新的慢指针slow2,当两个指针再次相遇就是入口!!!
        //这是什么道理?是质子吗??? 为什么不会错过?我试了很多次都是的,好魔幻啊!!!
        if(slow1!=null){
            ListNode slow2 = pHead;
            while(slow1!=slow2){
                slow1 = slow1.next;
                slow2 = slow2.next;                
            }
            return slow2;
        }
        return slow1;
    }

    public ListNode hasCycle(ListNode pHead){
        if(pHead==null)
        return null;

        //快慢指针
        ListNode slow = pHead;
        ListNode fast = pHead;

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

全部评论

相关推荐

今天 18:35
湖南大学 C++
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
07-30 13:44
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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