NowCoder 链表中环的入口节点
Description
一个链表中包含环,请找出该链表的环的入口结点。
解题思路
两个指针p,q从表头出发遍历链表,p每次走一步,q每次走两步。如果链表中有环,那么p,q最终会相遇。设p走了x步,q则走了2x,设环的长度为n,表头到环的入口节点距离为k。那么会有等式2x-x=n,即x=n,即p走过的路程为环的长度。设p此时走了环的距离为d(从入口节点开始算),那么就有k+d=x=n,所以p距离入口节点的距离为k,等于链表表头到环的入口节点的距离。那么此时q从表头出发,p从当前位置出发,两者每次走一步,相遇的节点就是入口节点。
代码
/*
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 *p, *q;
p = q = pHead;
while(p && q->next){
p = p->next;
q = q->next->next;
if(p == q)
break;
}
q = pHead;
while(p != q){
p = p->next;
q = q->next;
}
return p;
}
};