题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
快慢指针解题
在指针向后迭代的过程中,快指针比慢指针快一倍,把链表长度顺序切割为:
头节点到入口节点:a
入口节点到相遇节点:b
相遇节点到入口节点:c
可得以下公式
2(a+b) = a+b+c+b
=> a = c
思路是:相遇后快指针指向头节点,并且速度平齐慢指针
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
//成环前提 至少两个以上节点
if(pHead==nullptr||pHead->next==nullptr){
return nullptr;
}
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast){
slow = slow->next; // 慢指针走一步
if(fast->next == nullptr) return nullptr; // 若快指针的下一步不能走,则说明两指针不会相遇
fast = fast->next->next; // 快指针向后走两步
if(fast == slow){ // 找到相交节点, 此时慢指针已经走了nb步
fast = pHead; // 快指针重新移动到头
while(fast != slow){ // 直到两指针相遇位置,每次向后走一步
fast = fast->next;
slow = slow->next;
}
return fast; // 找到入口节点,直接返回
}
}
return nullptr;
}
};