快慢指针法
- 圆环相遇问题,用快慢指针,快指针步长为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;
}
};