leetcode之Linked List Cycle II

本文详细介绍了如何通过双指针法解决链表循环问题,并着重解释了如何找到循环开始的地方,包括数学推导和代码实现。

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

问题描述:

Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull.

Follow up:
Can you solve it without using extra space?

这里问题的关键是求环开始的地方。我们先来画一个图:

链表的方向是:X-》Y-》Z

现在我们分别设一个指向这个链表的两个指针,一个快指针F一个慢指针S,遍历链表,其中快指针是慢指针的两倍(s=s->next->next).

我们设Z+Y=C。

我们假设在m点相遇,那么我们可以得到:

快指针所走路程为:pC+Y+X

慢指针所走路程为:qC+X+Y

其中pq分别为快慢指针相遇前所走圈数。

我们有:

pC+Y+X=2(qC+X+Y)

因此我们有:

X+Y=pC-2qC

这里我们可以看到X+Y是圈的整数倍。

由于Y=C-Z

所以X=pC-2qC-C+Z。

如果我们在相遇时S从相遇的位置开始fF从head开始都以慢速开始走那么他们会在圈的开始处相遇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值