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

题目链接:https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&&tqId=11208&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  快慢指针:定义两个指针,这两个指针移动的速度一快一慢,一般情况下,快指针的移动步长是慢指针的两倍。显然我们可以知道,如果链表中有环那么快慢指针一定会相遇。如果有环,让其中一个指针指向头指针,然后这两个指针每次走一步,那么它们第一次相遇的点即为链表的入口结点。环的入口结点看下面图中的分析。
图片说明

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

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        ListNode fast = pHead, slow = pHead;
        boolean flag = false;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) { // 有环
                flag = true;
                break;
            }
        }
        if (!flag) return null;
        slow = pHead; //有环
        while (slow != fast) { // 找到入口结点
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
}
【剑指offer】题目全解 文章被收录于专栏

本专栏主要是刷剑指offer的题解记录

全部评论
快指针走过的路程是慢指针的二倍
点赞 回复 分享
发布于 2021-09-18 22:32

相关推荐

04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务