链表环类交点问题:双指针变体——快慢指针——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;//没有交点 } };
浙公网安备 33010602011771号