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

链表中环的入口结点

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

简单思路:使用哈希表

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode{
    if pHead==nil{
        return nil
    }
    mp:=make(map[*ListNode]struct{})
    p:=pHead
    for p!=nil{
        if _,ok:=mp[p];ok{
            return p
        }else{
            mp[p]=struct{}{}
        }
        p=p.Next
    }
    return nil
}

使用快慢指针,难点在于数学推理出如何走才能在环开头除碰面。

  • 推理过程

因此找到相遇点后,只需要q指针从头开始遍历,s指针从相遇点开始遍历,下一次相遇点就是环的起始点。

package main

func EntryNodeOfLoop(pHead *ListNode) *ListNode{
    if pHead==nil{
        return nil
    }
    q:=pHead
    s:=pHead
    for q!=nil&&q.Next!=nil{
        q=q.Next.Next
        s=s.Next
        if q==s{
            break
        }
    }
    if q==nil||q.Next==nil{
        return nil
    }
    q=pHead
    for q!=s{
        q=q.Next
        s=s.Next
    }
    return q
}

全部评论

相关推荐

码农索隆:以下是我以我微薄的认知提供的建议: 1.考个教师资格证,去当体育考试。 2.去健身房当健身教练(因为在我印象里面体育生身材都不错)。
点赞 评论 收藏
分享
白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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