栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode Java刷题笔记—142. 环形链表 II

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode Java刷题笔记—142. 环形链表 II

142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。不允许修改链表结构。这道题是141. 环形链表的延伸。

在做这道题之前,应该先做LeetCode Java刷题笔记—141. 环形链表。

先放代码,下面进行推导:

public class LeetCode142 {

    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        boolean hasCycle = false;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                hasCycle = true;
                break;
            }
        }
        if (hasCycle) {
            while (head != slow) {
                head = head.next;
                slow = slow.next;
            }
            return slow;
        }
        return null;
    }

    public class ListNode {

        int val;
        ListNode next;

        ListNode() {

        }

        ListNode(int val) {

            this.val = val;
        }

        ListNode(int val, ListNode next) {

            this.val = val;
            this.next = next;
        }
    }
}

假设已经证明了链表有环,我们目前仅能够得知相遇节点为s,头节点为h,其他的一概不知。

设头节点h到环入口节点长x,相遇节点s到环入口长a,相遇的时候slow节点在环内走过的长度为b,环长度为y。那么y=a+b。

那么,相遇时slow走过的长度为x+b,fast走过的长度为x+n(a+b)+b

由于fast是slow速度的二倍,那么距离也是二倍,那么2(x+b)=x+n(a+b)+b,我们来对这个的等式进行转换:

2(x+b)=x+n(a+b)+b
2x+2b=x+na+(n+1)b
2x=x+na+(n-1)b
x=na+(n-1)b
x=(n-1)(a+b)+a
x=(n-1)y+a

结果已经呼之欲出了,由于y的长度就是一圈的长度,因此,无论(n-1)y的结果是多少,最终都会是环长度的整数倍,从s节点出发,最终都会回到节点s,那么如果再走过a的距离,实际上s节点就到了环节点的入口,另一方面如果我们从头节点h开始走,经过x的距离时同样可以到达环节点的入口。

那么我们使用相遇节点s和头节点h同时出发,每次都走一步,当他们指向的节点相等时,那就是他们都走到了环节点的入口节点:

        if (hasCycle) {
            while (slow != head) {
                head = head.next;
                slow = slow.next;
            }
            return head;
        }

发散思维:如何求环长度呢?很简单,我们让fast在相遇点不动,然后slow从该节点出发单独去走一圈,直到再碰到fast节点,此过程中走过的路程就是环长度。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/703322.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号