*链表中环的入口结点

弄懂了思路:

首先判断是否为环:快慢指针,快是慢的两倍,如果相遇则有环;此时两个指针走的路程差就是环的长度或长度的n倍;

头到入口:a;环长度:b;相遇点到入口:c; 则 2*(a+b-c) = a+b+b-c; 得a=c; 即头到入口=相遇点到入口。

将快指针指向头,相同速度移动,遇到即为入口结点。

public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        //先判断有没有环:快慢指针,快=2*慢,如果相遇有环
        ListNode fast = pHead;
        ListNode slow = pHead;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                fast = pHead;
                while(fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return slow;
            }
        }
        return null;
    }
}

猜你喜欢

转载自www.cnblogs.com/dyq19/p/10509879.html