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

链表中环的入口结点

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

思路:双指针,主要是两个问题,一是判断是否有环,二是找到环的入口
对应的操作是:快慢指针如果相遇了,就是有环
			在第一步是的基础上,让快指针回到链表头,此后快指针每次加1,如果再次相遇,就是入口处。
/*
 public class ListNode {
    int val;
    ListNode next = null;

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


    //判断是否有环
    public ListNode hasCycle(ListNode pHead) {
        if (pHead == null) {
            return pHead;
        }

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

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        //快慢指相遇就说明链表是有环的
        //判断好有环之后,让快指针回到头开始遍历单步,这时候相遇点就在入口处了,数理逻辑

        ListNode slow = hasCycle(pHead);
        if (slow == null) {
            return null;
        }
        ListNode fast = pHead;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;

        }

        return slow;

    }
}

剑指offer刷题总结 文章被收录于专栏

本专栏是本人刷剑指offer的记录总结,也欢迎大家评论区留言讨论交流~

全部评论

相关推荐

05-27 14:57
西北大学 golang
强大的社畜在走神:27届真不用急,可以搞点项目、竞赛再沉淀沉淀,我大二的时候还在天天打游戏呢
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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