快慢指针找相遇点,相遇时慢指针从头开始跑,快指针从相遇点继续跑,最终在环的入口处相遇。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
break;
}
}
if(!fast || !fast->next)
{
//没有环退出;
return NULL;
}
//有环的情况下,快指针从相遇的地方继续跑,慢指针从头开始跑;
//最终在入口点相遇;
slow = pHead;
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}
};
京公网安备 11010502036488号