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

链表中环的入口结点

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
}

全部评论

相关推荐

咖啡不掺水:团子一志愿嵌入式今日已挂,等捞😭
投递美团等公司6个岗位 美团求职进展汇总
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务