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

来源:互联网 发布:网络火词2016 编辑:程序博客网 时间:2024/06/05 17:53

思路:1.通过两个指针,一个一次走一个节点,一个走两个,如果快的追上慢的,则说明有环

           2.且,追上处的节点为环中的一个节点,从该节点一次走一步计数,当回到原地,可知环的节点数

           3.两个指针都从链表头开始走,一个先走环的节点数;然后两个同时走,当两个相遇时,相遇节点为环的入口节点

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x):        val(x), next(NULL) {    }};*/class Solution {public:    ListNode* MeetingNode(ListNode* pHead)    {        if(pHead == NULL)            return NULL;        ListNode* pSlow = pHead->next;        if(pSlow == NULL)            return NULL;                ListNode* pFast = pSlow->next;        while(pFast != NULL && pSlow != NULL){            if(pFast==pSlow)                return pFast;            pSlow = pSlow->next;                        pFast = pFast->next;                        if(pFast==pSlow)                return pFast;                        if(pFast != NULL)                pFast = pFast ->next;        }                return NULL;    }    ListNode* EntryNodeOfLoop(ListNode* pHead)    {        ListNode* meetingNode = MeetingNode(pHead);//通过快追上慢的方法找到环中的任意一个node        if(meetingNode == NULL)            return NULL;                //得到环中节点的数目        int nodesInLoop = 1;        ListNode* pNode1 = meetingNode;        while(pNode1->next != meetingNode){            pNode1 = pNode1->next;            ++nodesInLoop;        }                //先移动pNode1,次数为环中节点的数目        pNode1 = pHead;        for(int i = 0; i < nodesInLoop;++i)            pNode1 = pNode1->next;                //再同时移动pNode1和品Node2        ListNode* pNode2 = pHead;        while(pNode1 != pNode2){            pNode1 = pNode1->next;            pNode2 = pNode2->next;        }        return pNode1;    }};


阅读全文
0 0
原创粉丝点击