链表中环的入口结点

链表中环的入口结点

http://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4

题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解题思路

1、设快慢指针,当快慢指针相遇时,快指针走的长度刚好是慢指针的两倍

2、快慢指针一定在环中相遇,而且第一次相遇慢指针一定还没绕环超过一圈,因为当慢指针进入环时,此时快指针无论在环中的哪个位置,都可以在慢指针走一圈之内追上。

3、可以设快慢指针在A点相遇,那么慢指针走过的长度位x1+x2,而快指针走过的长度为x1+x2+nL,其中L为圆环的长度,n为整数。当快慢指针相遇时,快指针走过的长度刚好是慢指针的两倍,则2(x1+x2)=x1+x2+nL,也就是x1+x2=nL。当快慢指针相遇在点A时,让新指针指向链表头和慢指针同步一步一步走,则他们刚好在入口处相遇。因为此使新指针刚好走了x1,而慢指针则刚好走了nL-x2。

代码如下:

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        ListNode *p,*q,*n;
        p = pHead;//快指针
        q = pHead;//慢指针
        while(p!=NULL && p->next!=NULL){
            p = p->next->next;
            q = q->next;
            if (p == q)
            {
                n = pHead; //新指针
                while(n != q){
                    n = n->next;
                    q = q->next;
                }
                return q;
            }
        }
        return NULL;
    }
};
全部评论

相关推荐

04-13 18:10
门头沟学院 Java
想熬夜的小飞象在秋招:被腾讯挂了后爸妈以为我失联了
点赞 评论 收藏
分享
04-25 19:29
已编辑
宁波大学 运营
被普调的六边形战士很高大:你我美牛孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务