题解 | #链表中环的入口结点#

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

第五题 第一种 利用hash函数
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        map<ListNode *,int> hash;
        // 利用的map 的hash函数
        // 出现过 就hash记录下来,每次判断是不是之前出现过
        ListNode* p=pHead;
        while(p!=NULL)
        {
            if (hash[p])
                return p;
            hash[p]=1;
            p=p->next;
        }
        return 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 )
            return NULL;
        
        // 两个快慢指针
        ListNode*p=pHead;
        ListNode*q=pHead;
        
        // 第一次循环 判断是否有环
        while(p!=NULL)
        {
            p=p->next->next;
            q=q->next;
            if(p==q)
                break;
        }
        
        // 如果没有环。p就是到了NULL结束的
        if (p==NULL)
            return NULL;
        
        // q回到开头重新开始 找到环开始的地方
        q=pHead;

        // 数学原理 我是记住了的。。。
        // 原理百度一下
        // https://blog.csdn.net/qq_43676757/article/details/109264389
        while(p!=q)
        {
            p=p->next;
            q=q->next;
        }
        return p;
    }
};


题解 文章被收录于专栏

一遍做剑指offer 一边保存做题步骤 并附带详细注释哦

全部评论

相关推荐

扭转乾坤_:现在企业都是学华为,一直通过丢池子里,最后捞
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务