leetcode--09. 链表环起点 II

题目:
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Follow up:
Can you solve it without using extra space?
给定一个链接列表,返回循环开始的节点。如果没有循环,则返回NULL。
拓展:
你能在不占用额外空间的情况下解决这个问题吗?

思路:
快慢两个指针,先判断是否有环,没有返回null,有的话,快慢两个指针会相遇
然后两指针分别从头和从相遇点出发,再次相遇即为环入口点

至于为什么:


image.png

证明如下:
如上图所示,X,Y,Z分别为链表起始位置、环开始位置和两指针相遇位置,则根据快指针速度为慢指针速度的两倍,可以得出:
2 * (a + b) = a + b + n * (b + c);即
a = (n - 1) * b + n * c = (n - 1) * (b + c) + c;
注意到b + c恰好为环的长度,故可以推出,如将此时两指针分别放在起始位置和相遇位置,并以相同速度前进,当一个指针走完距离a时,另一个指针恰好走出 绕环n-1圈加上c的距离。
故两指针会在环开始位置相遇。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null)
            return null;
        ListNode slow = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                ListNode meetNode = fast;
                while (head != meetNode) {
                    head = head.next;
                    meetNode = meetNode.next;
                }
                return meetNode;
            }
        }
        return null;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 10,990评论 0 13
  • 昨晚下班回到家,老大还没睡,一边换着鞋一边问他怎么还不睡觉,都10点多了,老大说爸爸今天回来的晚,刚教我学习完,我...
    仲昊惟阅读 229评论 0 1
  • 我是瞿新林,我今天的学习心得是: 一、理解微信互联网牧场草地构成的三部分;①微信公众号是传输媒体,分享有营养有价值...
    紫岩冲口的瑶人阅读 1,240评论 0 0
  • 听了傅雷家书中关于爱情的部分,觉得很不错,可以看到一个中国知识分子对爱情的真知灼见。在这里做个总结和记录,以作为择...
    YorkYoung阅读 1,880评论 0 2
  • Y叔算是我工作以来的第一个客户,差不多10年前去路演,发了资料给Y叔,一个月后他拎着55万现金来银行存,很高兴也很...
    MandyDML阅读 339评论 0 2

友情链接更多精彩内容