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

链表中环的入口结点

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
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:02
ssob上原来真有BOSS啊
硫蛋蛋:这种也是打工的,只不是是给写字楼房东打工
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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