链表中环的入口结点

题目描述

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

思路

  1. 找到环中结点。一个慢指针每次走一步,一个快指针一次走两步,两个指针相遇即为环中结点meeting node,同时meetingnode到入口结点距离和头结点到入口结点距离相同
  2. 解释: 同时从头结点出发,快指针路径是慢指针路径两倍,同时快指针和慢指针路径只差为环的长度,则头指针到meeting node距离即为环的长度。

code

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead==NULL)
            return NULL;
        ListNode* pquick=pHead;
        ListNode* pslow=pHead;
        bool notfirst=false;
        while(pquick&&pslow) // find meeting node in circle
        {
            if(pquick==pslow&&notfirst)
            {
                break;
            }
            pslow=pslow->next;
            if(pquick->next)
                pquick=pquick->next->next;
            else
                return NULL;
            notfirst=true;
        }
        pslow=pHead;
        while(pslow&&pquick&&pslow!=pquick)// find entry of circle
        {
            pslow=pslow->next;
            pquick=pquick->next;
        }
        return pslow;
    }
};

猜你喜欢

转载自blog.csdn.net/ytang_/article/details/80041310