Linked List Cycle II -- LeetCode

本文介绍了一种在链表中定位环入口节点的有效算法。通过快慢指针判断链表是否存在环,并利用数学原理推导出环的起始位置。最终通过双指针同步移动实现精确定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接: http://oj.leetcode.com/problems/linked-list-cycle-ii/
这道题是 Linked List Cycle 的扩展,就是在确定是否有cycle之后还要返回cycle的起始点的位置。从 Linked List Cycle 中用的方法我们可以得知a=kc-b(不了解的朋友可以先看看 Linked List Cycle )。现在假设有两个结点,一个从链表头出发,一个从b点出发,经过a步之后,第一个结点会到达cycle的出发点,而第二个结点会走过kc-b,加上原来的b刚好也会停在cycle的起始点。如此我们就可以设立两个指针,以相同速度前进知道相遇,而相遇点就是cycle的起始点。算法的时间复杂度是O(n+a)=O(2n)=O(n),先走一次确定cycle的存在性并且走到b点,然后走a步找到cycle的起始点。空间复杂度仍是O(1)。代码如下:
public ListNode detectCycle(ListNode head)
{
    if(head == null || head.next == null)
        return null;
    ListNode walker = head.next;
    ListNode runner = head.next.next;
    while(runner!=null && walker!=runner)
    {
        walker = walker.next;
        if(runner.next!=null)
            runner = runner.next.next;
        else
            runner = null;
    }
    if(runner == null)
        return null;
    runner = head;
    while(walker!=runner)
    {
        walker = walker.next;
        runner = runner.next;
    }
    return walker;
}
这道题目更多的是数学上相遇点的推导,有了理论基础之后就是比较简单的链表操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值