算法与数据结构二叉树之下数据结构和算法分析

剑指Offer55 链表环入口(链表多指针遍历)

2019-01-21  本文已影响1人  北国雪WRG

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

带有环的链表.png
  1. 设置两个指针,快指针每次走两步,慢指针每次走一步
  2. 两个指针同时走,直到相遇
  3. 记录相遇点为B
  4. 设置两个指针,一个从A出发,一个从B出发,必定在C相遇!

为啥呢????

  1. 当在B相遇的时候,快指针比慢指针多走了N个环
  2. 快指针还差BC长度就走了 AC + M个环
  3. 所以BC = AC + S个环
  4. 从A和B同时出发的两个速度相同的指针点显然在C(仔细琢磨为啥)

牛客网

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
         if(pHead==null||pHead.next==null)return null;
         ListNode p1=pHead;
         ListNode p2=pHead;
        while(p2!=null&&p2.next!=null)
         {
            p1=p1.next;
            p2=p2.next.next;
            if(p1==p2)
            {
                p1=pHead;
                while(p1!=p2)
                {
                    p1=p1.next;
                    p2=p2.next;
                }
                if(p1==p2)return p1;
            }
        }
        return null;
    }
上一篇 下一篇

猜你喜欢

热点阅读