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

题目描述

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

思路

  1. 设立一个vector保存访问过的结点,每次压入新结点之前遍历vector,若找到了相同结点,则返回,若没有,则压入
  2. 设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。

代码

方法一:

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        vector<ListNode*> v;
        if(pHead == NULL)
            return NULL;
        v.push_back(pHead);
        pHead = pHead->next;
        while(pHead != NULL)
        {
            for(int i = 0; i < v.size();i++)
            {
                if(pHead == v[i])
                    return pHead;
            }
            v.push_back(pHead);
            pHead = pHead->next;
        }
        return NULL;
    }
};

方法二:

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        ListNode*fast=pHead,*low=pHead;
        while(fast&&fast->next){
            fast=fast->next->next;
            low=low->next;
            if(fast==low)
                break;
        }
        if(!fast||!fast->next)return NULL;
        low=pHead;//low从链表头出发
        while(fast!=low){//fast从相遇点出发
            fast=fast->next;
            low=low->next;
        }
        return low;
    }
};
发布了85 篇原创文章 · 获赞 0 · 访问量 402

猜你喜欢

转载自blog.csdn.net/weixin_38312163/article/details/104766170
今日推荐