题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路:定义俩个快慢指针,同时指向链表的头指针,快指针每次走俩步,慢指针每次走一步,当快慢指针相遇的时候,此时证明链表中有环,然后将快指针指向头指针,然后快指针和慢指针同时走,每次走一步,当快慢指正再次相遇的时候,此时这个结点就是环的入口结点。
代码示例如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL)
{
return NULL;
}
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast && fast->next)
{
fast = fast->next->next;//快指针每次走俩步
slow = slow->next; //慢指针每次走一步
if(fast == slow) //此时证明链表中存在环
{
fast = pHead;
break; //结束,跳出循环
}
}
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast; //此时,slow和fast相遇,这就是环的入口结点
}
};
测试结果如下: