leetcode142. Linked List Cycle II

本文介绍了一种在不修改链表的前提下,通过双指针法解决寻找循环链表起始节点的问题,详细解释了数学关系式推导及算法实现。

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

        

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

Note: Do not modify the linked list.

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

   给定一个链表,返回循环开始的节点,如果没循环,则返回空,并且不能修改链表,所以上一题那个修改链表的方法就不能用了,所以这道题还是用双指针,我们一定会想到用距离求解,所以我们要充分利用已知条件去推数学关系式,假设slow的速度是v1,则fast的速度是v2,则v2=2v1,所以slow走过的路程和fast走的路程关系是2v1*t = v2*t,所以我们可以得到

设x是起点,Y是开始循环的节点,Z是二者相遇节点,abc分别代表三段距离,则二者第一次相遇时有这个关系a+b+c+b = 2(a+b),可以推出a=c,所以,从Z到Y,和从X到Y在速度相同的情况下,会同时到达Y,所以我们在第一次相遇时,令其中一个指针指向头,然后同时开始,每次移动一个,在相遇时返回的指针,就是开始循环的指针。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* detectCycle(ListNode *head) {
        ListNode *fast = head;
        ListNode *slow = head;
        while(fast != NULL && fast->next != NULL) {
            fast = fast->next->next;
            slow = slow->next;
            if(slow == fast) {
                slow = head;
                while(slow != fast) {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow;
            }
        }
        return NULL;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值