每天一道剑指offer-链表中环的入口节点

题目描述

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

思路

首先判断链表中是否有环,设置两个指针,一个一次走一步,另一个一次走两步,若链表中存在环,则两个指针一定会相遇,否则输出null
有环,找出环的入口节点,当两节点第一次相遇后,让其中一个指针指向头结点,每次走一步,再次相遇时的节点就是入口节点。推导可自行百度。

代码

public ListNode EntryNodeOfLoop(ListNode pHead){
        ListNode p1 =pHead;
        ListNode p2 = pHead;
        while(p1!=null && p2!=null){
            p1 = p1.next;
            if(p2.next == null){
                return null;//p2.next ==null 时, 其next报错
            }
            p2 = p2.next.next;
            if(p1 == p2){//有环
                p2 = pHead;
                while(p1 != p2){
                    p1 = p1.next;
                    p2 = p2.next;
                }
                return p1;
            }
        }
        return null;
    }

猜你喜欢

转载自blog.csdn.net/weixin_42069523/article/details/88700830