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

链表中环的入口结点

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
}

全部评论

相关推荐

买蜜雪也用卷:我觉得应该没有哪个人敢说自己熟练使用git,代码分支一复杂还是得慢慢寻思一下的,不过基本的拉代码提交代码还有分支什么的是应该会
点赞 评论 收藏
分享
面试官问:为什么不考研?该怎么回答啊😭我说现在的就业环境差到底了,还有就是我不想学数学,感觉面试官笑容都凝固了😢
DayDayNoBug的鲜芋球:我说的是“上学期其实尝试过去探索一些研究的方向,但感觉那些对我来说都没有很大的吸引力,相比起研究我可能更喜欢开发这种实践性的东西,它会让我觉得很有意思并且会为之深入进去”(虽然也不知这个回答怎么样哈哈哈哈哈哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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