剑指offer——56/66链表中环的入口结点

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

思路:双指针方法,fast每次走两布,slow每次走一步,两个指针相遇的时候,假设非环路径为x,环长度为y,相遇时slow走的环的距离是A,

即:fast=x+n*y+A;slow=x+A;因为fast比slow多一倍距离,因此此时让slow回到起点,slow和fast同时一步走,相遇即为环的入口起点。

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead==nullptr)
            return nullptr;
        ListNode* fast=pHead;
        ListNode* slow=pHead;
        while(fast->next!=nullptr)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
            {
                break;
            }
        }
        if(fast->next==nullptr)
            return nullptr;
        
        slow=pHead;
        while(slow!=fast)
        {
            slow=slow->next;
            fast=fast->next;
        }
        return fast;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_17141957/article/details/81061804