链表环类交点问题:双指针变体——快慢指针——142. 环形链表 II

链表找环路的通用解法:快慢指针

使用方法:

给定两个指针,分别命名为 slow 和 fast,起始位置在链表的开头。每次 fast 前进两步, slow 前进一步。如果 fast可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路,且一定存在一个时刻 slow 和 fast 相遇。

当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。

当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *pSlow = head;//快指针:一次走两步
        ListNode *pFast = head;//慢指针:一次走一步
        ListNode *pTemp = head;//追赶指针:最后确定链表交点的时候使用
        while (pFast != NULL && pFast->next != NULL) {//--判断:pFast是否到尽头
            pFast = pFast->next->next;                //--快指针:一次走两步,慢指针:一次走一步
            pSlow = pSlow->next;
            if (pFast == pSlow) {                     //--第一次相遇:确定有环
                while (pTemp != pSlow) {              //--第二次相遇:确定交点
                    pTemp = pTemp->next;              //--第二次循环时,快指针-》一次走一步
                    pSlow = pSlow->next;
                }
                return pFast;
            }
        }
        return NULL;//没有交点
    }
};
View Code

 

posted on 2021-03-07 18:22  平ping  阅读(69)  评论(0)    收藏  举报