快慢指针算法(Hare and Tortoise Arithmetic)是一种判断一个链表中是否有环路的算法。

慢指针每次走一步,快指针每次走两步(可以是任意长>1的步数),当有回路的时候,两个指针必然有相等的时候。

时间复杂度为O(n)

LeetCode 第141题 (模板)

bool hasCycle(ListNode *head){
    if (head==NULL||head->next==NULL) {
        return false;
    }
    ListNode *slow=head;
    ListNode *fast=head->next;
    while(fast!=NULL&&fast->next!=NULL){
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow) return true;  
    }
    return false;
}

LeetCode第142题

//前面和模板基本一样
//主要目标为寻找入口点
slow=head;
while(slow!=NULL&&fast!=NULL){
    if(fast==slow) return slow;
    slow=slow->next;
    fast=fast->next;
}
return NULL;

入口的数学证明 假设C点为相遇点,此时头节点到入口距离为1(AB),入口到相遇点的距离为1(BC),相遇点到入口的距离为3(CB),环长为4=BC+CB。

在相遇时,快指针走过的步数=AB+BC+n(BC+CB),慢指针的步数=AB+BC。快指针每次走 2 步,慢指针每次走 1 步=> AB+BC+n(BC+CB)=2*(AB+BC)。AB= (n-1) * (BC+CB)+CB ,说明同时从头节点和相遇节点出发的两个指针,每次走 1 步,最终会在入口处相遇。