您的位置:首页 > 其它

LeetCode:Linked List Cycle II

2015-03-04 21:46 302 查看


class Solution {
public:
ListNode *detectCycle(ListNode *head) {
//判断是否有环,并找到环的入口。算法思想:设起点距离环入口结点个数为a,环中包含结点个数为r,相遇时距离环入口结点个数是x,则根据快、慢指针的速度比,得出nr+x+a=(x+a)*2,(n大于1,因为单链表是同向的)最终得到a=nr-x;变换一下公式看看就发现一个很有意思的地方:a=(n-1)r+r-x;r-x为环中x结点处距离达到环入口的结点个数即若此时一个指针从起点出发,一个指针在X处出发,速度相同,将会同时走完这段距离,即到达入口处
if(!head||!head->next)
return NULL;
if(head->next==head)
return head;
ListNode *p,*q;
p=head;
q=head;
while(q&&q->next)
{
p=p->next;
q=q->next->next;
if(p==q)
break;
}
if(p!=q)//不存在环
return NULL;
else{//存在环
p=head;
while(p!=q)
{
p=p->next;
q=q->next;
}
}
return p;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: