題目:給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出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相遇,這就是環的入口結點
}
};
測試結果如下: