题解 | #链表中环的入口结点#
链表中环的入口结点
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
}