前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >找出链表种环的入口结点

找出链表种环的入口结点

作者头像
名字是乱打的
发布2022-05-13 09:02:03
1860
发布2022-05-13 09:02:03
举报
文章被收录于专栏:软件工程

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路1.

环即两次出现的结点,所以我们可以利用set存储,如果存的时候发现某个结点已经存储了,则,这个结点就是环入口

代码:

代码语言:javascript
复制
//题目描述
//给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        Set<ListNode> set=new HashSet<>();
        ListNode curr=pHead;
        while (curr!=null){
            if (set.contains(curr))
                return curr;
            set.add(curr);
            curr=curr.next;
        }
        return null;

    }
思路2

定义两个指针,一个一次走两步的快指针一个慢指针,如果有环存在,则他们一定会在环上某个结点相遇.这时候他们都开始每次都一步,则下次相遇的点一定是环入口结点.

思路2证明

两个结论:

1、设置快慢指针,假如有环,他们最后一定相遇。

2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。

证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。

证明结论2: 设: 链表头到环入口长度为--a 环入口到相遇点长度为--b 相遇点到环入口长度为--c

则:相遇时 快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。 慢指针路程=a+b 快指针走的路程是慢指针的两倍,所以: (a+b)*2=a+(b+c)k+b 化简可得: a=(k-1)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。

代码:

代码语言:javascript
复制
 public ListNode EntryNodeOfLoop2(ListNode pHead) {
        if (pHead == null || pHead.next == null) {
            return null;
        }
        //找出环中相遇的点
        ListNode p1 = pHead; //每次走一步的结点
        ListNode p2 = pHead;//每次走两步的结点
        ListNode pmeet = null;
        while (p2 != null && p2.next != null) { //p2比p1跑的快,如果没有环的话p2先挂掉,所以只判断p2就可以了
            p1 = p1.next;
            p2 = p2.next.next;
            if (p1 == p2) {
                pmeet = p1;
                break;
            }
        }
        if (pmeet == null) {//没环,没有相遇
            return null;
        }
        //如果有环.p1从头走,p2从相遇结点走,下一次相遇就是那个环结点.
        p1 = pHead;
        p2 = pmeet;
        while (p1 != p2) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 思路1.
    • 代码:
      • 思路2
        • 思路2证明
        • 两个结论:
        • 代码:
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档