给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围:
,
要求:空间复杂度
,时间复杂度
例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:
可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。
输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表
返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
{1,2},{3,4,5}
3
返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3
{1},{}
"null"
没有环,返回对应编程语言的空结点,后台程序会打印"null"
{},{2}
2
环的部分只有一个结点,所以返回该环形链表入口结点,后台程序打印该结点对应的结点值,即2
package main import "fmt" func EntryNodeOfLoop(pHead *ListNode) *ListNode { var addrlist = make(map[*ListNode]int) if pHead == nil || pHead.Next == nil { return nil } for pHead != nil { fmt.Println(pHead.Val) addrlist[pHead] += 1 if addrlist[pHead] == 3 { return pHead } pHead = pHead.Next } return nil } 还好这些例子简单
package main func EntryNodeOfLoop(pHead *ListNode) *ListNode{ // 快慢指针 slow, fast := pHead, pHead for fast != nil && fast.Next != nil { slow, fast = slow.Next, fast.Next.Next if slow == fast { fast = pHead for fast != slow { slow, fast = slow.Next, fast.Next } return slow } } return nil }
package main func EntryNodeOfLoop(pHead *ListNode) *ListNode{ slow, fast, p := pHead, pHead, pHead for fast != nil && fast.Next != nil{ slow = slow.Next fast = fast.Next.Next if slow == fast{ for p != slow{ p = p.Next slow = slow.Next } return p } } return nil }
func EntryNodeOfLoop(pHead *ListNode) *ListNode { fast, slow := pHead, pHead for fast != nil && fast.Next != nil { fast = fast.Next.Next slow = slow.Next if fast == slow { break } } if fast == nil || fast.Next == nil { return nil } fast = pHead for fast != slow { fast = fast.Next slow = slow.Next } return fast }
package main func EntryNodeOfLoop(pHead *ListNode) *ListNode{ if pHead == nil {return pHead} fast, slow := pHead, pHead for fast != nil && fast.Next != nil { fast = fast.Next.Next slow = slow.Next if fast == slow { slow = pHead for fast != slow { fast = fast.Next slow = slow.Next } return fast } } return nil }
当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。