链表中环的入口结点

题目描述

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

时间限制:1秒 空间限制:32768K

解题思路

1、暴力解题:使用HashSet将不重复的结点加入,重复结点直接返回即可

import java.util.HashSet;
public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        HashSet<ListNode> hs=new HashSet<>();
        while(pHead!=null){
            if(hs.isEmpty()||!hs.contains(pHead)) hs.add(pHead);
            else return pHead;
            pHead=pHead.next;
        }
        return null;
    }
}

2、使用前后指针
链表中环的入口结点

判断环是否存在。两个速度不同的指针(fast和slow)从起点出发,如果有环则必定会相遇,若fast指向null则不存在环

找到环的入口。两指针第一次相遇后,让一个指针从头结点,另一个指针从相遇结点,以相同速度开始移动,再次相遇的结点即为环的入口结点。
假设存在环,fast以速度2运行,slow以速度1运行,证明如下:
(1)slow第一次移动到环入口结点时。如图所示

a为起点h到环入口t的距离;m1为slow首次到环入口t时fast的位置;b为位置t到m1的距离;n为环的周长

此时,slow指针移动的距离为a,fast指针移动的距离为a+b+x*n(x为fast移动的圈数),由于fast的速度是slow速度的两倍,因此2a=a+b+x*n得出a=b+x*n
(2)两指针首次相遇时
m2为两指针首次相遇的位置;

由于slow到达t位置时,fast离t位置逆时针的距离为n-b。两指针的速度差为1,因而需要n-b的时间才能相遇。此时slow移动的总距离为a+n-b。因此首次相遇点m2离环入口t的逆时针距离为b
(3)求环入口的办法
由于第一次相遇点m2离环入口t的逆时针距离为b,因此指针只需要移动b+y*n的距离(y为移动的圈数)即可。此时由于起点h到环入口t的距离a=b+x*n,因此只需要将slow指针移动起点h处,fast指针仍然在相遇点m2处,让它们以相同速度移动,slow和fast相遇的结点就是环入口t

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode fast=pHead,slow=pHead;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(slow==fast){
                slow=pHead;
                while(slow!=fast){
                    slow=slow.next;
                    fast=fast.next;
                }
                return fast;
            }
        }
        return null;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路:a、第一步,找环中相汇...
    fighting_css阅读 279评论 0 0
  • 本文首发于我的个人博客:尾尾部落 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出nul...
    繁著阅读 2,256评论 1 0
  • 思路:leetcode上也有这道题,具体思想是,两个指针fast和slow,fast以slow两倍速度前进,如果没...
    DaiMorph阅读 324评论 0 1
  • 随着年龄的增长 与父母的话越来越少 甚至看不上他们的做法想不通他们的行为 曾经教我走路喂我吃饭陪我睡觉的他们 如今...
    一平如喜阅读 278评论 0 2
  • 一、天赋描述 你是一个高度灵活的指挥家。 当面对一个涉及多种因素的复杂环境时,你喜欢设法控制所有的变量,将它们反复...
    Action1224阅读 667评论 0 2