链表中环的入口节点

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

方法1:用集合的方法
遍历链表,如果集合中没有这个节点,就放进集合,如果集合中有这个节点,就返回这个节点(该节点就是链表环的入口节点)
如果p为NULL了,证明该链表没有环,返回NULL

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        unordered_set<ListNode*> s;
        ListNode* p=pHead;
        while(1)
        {
            if(s.find(p)==s.end())
            {
                s.insert(p);
                p=p->next;
            }
            else
                return p;
            if(p==NULL)
                return NULL;
        }
    }
};

方法2:快慢指针的方法
定义一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步;
如果快指针指向了NULL,则没有环;
若快慢指针相遇了,则证明一定有环;
此时,让快指针返回头结点,两个指针同时往前走,当两指针再次相遇时,该节点则为环的入口节点

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead==NULL||pHead->next==NULL||pHead->next->next==NULL)
            return NULL;
        ListNode* pFast=pHead->next->next;
        ListNode* pSlow=pHead->next;
        while(pFast!=pSlow)
        {
            pFast=pFast->next->next;
            pSlow=pSlow->next;
            if(pFast->next==NULL||pFast->next==NULL)
                return NULL;
        }
        pFast=pHead;
        while(pFast!=pSlow)
        {
            pFast=pFast->next;
            pSlow=pSlow->next;
        }
        return pFast;
    }
};
全部评论

相关推荐

昨天 13:47
门头沟学院 Java
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 17:10
什么素质,我请问呢,要掉小珍珠了。。。又憋屈又生气
苍蓝星上艾露:给它们能的,一群dinner牛马挥刀向更弱者罢了。我写的开源求职AI co-pilot工具,优化你的简历,找到你匹配的岗位,定制你的简历,并让你做好面试准备https://github.com/weicanie/prisma-ai
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务