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

链表中环的入口结点

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 {
    private ListNode hasCycle(ListNode pHead) {
        if (pHead == null) {
            return null;
        }
        ListNode fast = pHead;
        ListNode slow = pHead;

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

            if (fast == slow) {
                return slow;
            }
        }

        return null;
    }
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        ListNode slow = hasCycle(pHead);  // 如果有环,slow指针停在两者相遇的地方
        ListNode fast = pHead;  // fast指针停在开头

        if(slow == null) {  // 没有环,直接返回null,不作此判断会进入下面的while循环,因为fast!=null可能成立
            return null;
        }

        // 两者继续遍历,再次相遇的地方就是环入口
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }

        return slow;
    }
}

全部评论

相关推荐

找到实习就改名4月17日下午更改:1600一个月?
点赞 评论 收藏
分享
劝退式:感觉有人回才是不正常的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务