题解 | #链表中环的入口结点#
链表中环的入口结点
http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
解法:快慢指针;
当两个指针进入环后有一个相遇结点,慢指针走了X+Y,因为快指针走的长度是慢指针的两倍,所以快指针走了2*(X+Y)。现在求相遇结点到入口结点的距离:2*(X+Y)-X-Y-Y=X; 所以我们发现,(相遇结点到入口节点的距离) == (头指针到入口结点的距离),那么此时只需要将快指针返回头指针,然后一步一步走,而慢指针也一步一步走,两个指针第二次相遇的结点就是入口结点。
```/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
if(pHead == nullptr)
return nullptr;
ListNode* fast = pHead;;
ListNode* slow = pHead;
while(fast != nullptr && fast->next != nullptr){
fast = fast->next->next;
slow = slow->next;
if(slow == fast)
{
break;
}
}
if(fast == nullptr || fast->next == nullptr)
return nullptr;
fast = pHead;
while(fast!=slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
};