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

链表中环的入口结点

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

法一:双指针。 参考讨论区却顾所来径的清晰解释思路。

设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。

两个结论: 1、设置快慢指针,假如有环,他们最后一定相遇。 2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。

两个结论证明参见讨论区

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def EntryNodeOfLoop(self, pHead):
        #空链表判断
        if pHead==None or pHead.next==None:#注意:'NoneType' object has no attribute 'next'。如果phead为空,不能pHead.next.next
            return None
        fast=pHead.next.next#如果写fast=pHead,slow=pHead,那么fast直接等于slow,下面不好循环
        slow=pHead.next
        #第一,先找相遇点        
        while fast !=slow:
            if fast==None:#如果.next遇到空节点,说明走到底了,没有环
                return None
            fast=fast.next.next
            slow=slow.next
        #第二,找环入口。两个指针分别从链表头和相遇点继续出发,每次走一步
        fast=pHead
        while fast !=slow:
            fast=fast.next
            slow=slow.next
        return fast

时间复杂度:O(n),需要将链表的所有结点遍历一遍

空间复杂度:O(1),需要额外两个快慢指针来遍历结点。

法二:哈希表。 最常规易懂的解法,遍历整个链表结点,然后用哈希表(可以用集合)来存储已访问过的结点,最后进行对比。若该结点已存在哈希表中,则代表该结点是我们要找的环形链表的入口结点;否则把结点添加到哈希表中,继续往下遍历。可参考题解区不是江小白的代码。

时间复杂度:O(n) (因为最糟糕的情况就是遍历了整个链表,n 代表链表中的结点数)

空间复杂度:O(n) (最糟糕的情况是把整个链表的结点插入哈希表中)

全部评论

相关推荐

11-28 17:58
门头沟学院 Java
美团 JAVA开发 n×15.5
牛客786276759号:百度现在晋升很难的 而且云这块的业务没美团好 你看百度股价都跌成啥样了
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务