剑指offer 链表中环的入口结点

来源:互联网 发布:天刀白玉京捏脸数据 编辑:程序博客网 时间:2024/06/04 19:49

题目描述
一个链表中包含环,请找出该链表的环的入口结点。

思路:
第一步设两个指针fast,slow,然后从头开始,一个指针一下只走1步,1个指针一下子走2步,在某个时刻肯定会相遇。先看如下图:
这里写图片描述
那么可以得到slow,fast指针走的路径长度为:
2slow=fast
首先设直线跑道的长度为x,圆圈的周长为c,出去黑线部分的长度为y
那么由距离公式得:
2*(x+n*c+y) = x+m*c+y,那么得到x = (m-2*n-1)c+c-y ,发现直线跑道的长度和黑色曲线长度一样,那么可以把一个指针指在起点处,另外一个指在那个相遇点,然后以相同的速度运动,当在直线上运动的指针到达入口时,在圈上的指针必定在入口处,因为x = 某个值* c+黑线长度 ,此时就是链表的入口处;
代码:

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) :        val(x), next(NULL) {    }};*/class Solution {public:    ListNode* EntryNodeOfLoop(ListNode* pHead)    {        ListNode *p1,*p2;        p1 = pHead->next;        p2 = pHead->next->next;        if(pHead==nullptr||p1==nullptr||p2==nullptr)  return nullptr;        while(p1!=p2)        {             if(p1!=nullptr&&p2!=nullptr)            {                p1 = p1->next;                p2 = p2->next->next;            }            else return nullptr;        }        p1 = pHead;        while(p1!=p2)        {            p1 = p1->next;            p2 = p2->next;        }        return p1;    }};
原创粉丝点击