题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
完整的数学证明
O --- 非循环链表的长度
L --- 循环链表的长度
K --- 从循环链表入口节点,到快慢节点的相遇节点的长度
依照2倍的关系得出 2(O+k) = O+nL+k --- 其中n是指快指针的循环次数
得出 2O+2k = O+nL+k
O=nL-k
O= (n-1)L + (L-k)
快指针从k出发,经过L-k后,正好到达了入口节点。
重新回头审视一下,快指针处于环中的k,慢指针从头开始。经过(n-1)L 圈后,快指针还是处于k位置。此时慢指针再走L-k,快指针再走L-k,就会合到了入口节点。
package main
func EntryNodeOfLoop(pHead *ListNode) *ListNode{
if pHead == nil || pHead.Next == nil {
return nil
}
// 快慢指针
fast := pHead
last := pHead
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
last = last.Next
if fast == last {
break
}
}
// 第一次相遇
if last == nil || fast == nil {
// 无环
return nil
}
last = pHead
for last != fast {
last = last.Next
fast = fast.Next
}
return last
}
vivo公司福利 368人发布
查看7道真题和解析