剑指offer之链表中环的入口节点

在这里插入图片描述
在这里插入图片描述
如图,链表起点为a,环的入口点为b,设两个快慢指针从a开始,一个一次走两个节点,一个一次走一个,那么最终他们肯定会相遇的,假设相遇点为c,那么根据推算,有c到b的距离即图中红线部分,长度等于a到b,所以我们再设一个指针指向a,让之前设置的慢指针接着c开始,两个一人走一步,那么最终相遇的点就是环的入口即b。


    public ListNode EntryNodeOfLoop(ListNode pHead) {
    
    
        if (pHead == null||pHead.next == null) {
    
    
            return null;
        }
        ListNode fast = pHead;
        ListNode slow = pHead;
        while (fast != null &&fast.next!=null) {
    
    
            fast = fast.next.next;
            slow = slow.next;
            if (slow == fast) {
    
    
                ListNode slow2 = pHead;
                while (slow != slow2) {
    
    
                    slow = slow.next;
                    slow2 = slow2.next;
                }
                return slow;
            }
        }
        return null;

    }

猜你喜欢

转载自blog.csdn.net/AIJXB/article/details/113682077