快慢指针法

  • 圆环相遇问题,用快慢指针,快指针步长为2,慢指针步长为1,如果存在环必然相遇。
  • 有画图可得当,相遇时,快指针到环的入口节点距离和头节点到入口节点距离相同,此时相遇点和头节点同步长出发,必然相遇在入口节点。
  • 注意非环节点时判断,快指针移动时判断本身节点以及下一个节点是否为空。
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* slow=pHead;
        ListNode* fast=pHead;
        while(fast&&fast->next)
        {
            slow=slow->next;
            //fast->next存在
            fast=fast->next->next;
            if(slow==fast)
            {
                //相遇
                break;
            }
        }
        if(!fast||!fast->next)
        {
            //fast为空 无环
            return nullptr;
        }
        slow=pHead;
        while(slow!=fast)
        {
            slow=slow->next;
            fast=fast->next;
        }
        return slow;
    }
};