leetcode.142 LinkedList Cycle II

问题描述:

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.

我的思路:

Linked List Cycle中, 我们使用了快慢指针来判断链表是否存在环。而在一开始,我天真的以为,快慢指针相遇的地方便是循环入口,虽然有这种可能性,但是也存在相遇点不是入口的可能性。我们要找更一般的表达式。

且看下图:

快慢指针同时从七点出发,假设首次相遇点为标星地点,则我们可以得到:

慢指针所走步数: a + b

快指针所走步数: a + b + c + b

因为首次相遇,所以不能存在快指针绕了好几圈的可能性。

又因为我们所设置的步长为:Vf = 2*Vs

即:(a + b) * 2 = a + b + c + b 可得a = c

所以我们可以将慢指针放置在链表头部,快指针依然置于相遇点,设置步长都为一,然后他们自此首次相遇的点即为环的入口

代码:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* p1 = head;
        ListNode* p2 = head;
        while(p2 && p2->next){
            p1 = p1->next;
            p2 = p2->next->next;
            if(p1 == p2)
                break;
        }
        if(p2 == NULL || p2->next == NULL)
            return NULL;
        p1 = head;
        while(p1 != p2){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p1;
    }
};

此时空间复杂度为1

原文地址:https://www.cnblogs.com/yaoyudadudu/p/9049118.html

时间: 2024-10-11 00:06:17

leetcode.142 LinkedList Cycle II的相关文章

LeetCode: Linked List Cycle II [142]

[题目] Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? [题意] 给定一个单向链表,如果链表有环,则返回环开始的位置. [思路] 仍然是维护两个指针, p1, p2, p1每次走一步, p2每次走两步 假设进入环之前要走X步,环长为y步,p2第

LeetCode Linked List Cycle II

/** * 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;

[LeetCode]Linked List Cycle II解法学习

问题描述如下: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 从问题来看,如果可以充分利用额外空间的话,这个题目是不难的,然而题目提出了一个要求,能否在不使用任何额外空间的情况下解决这个问题. 通过反复思考,我觉得这题类似于追击问题,可以用一个

LeetCode: Linked List Cycle ii 解题报告

Linked List Cycle ii Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? SOLUTION 1: 最开始的想法和 Linked List Cycle这一题一样. SOLUTION 2: 同样是两个指针,一快一慢,相遇时跳出循环,只

[Leetcode] Linked list cycle ii 判断链表是否有环

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? 题意:给定链表,若是有环,则返回环开始的节点,没有则返回NULL 思路:题目分两步走,第一.判断是否有环,第二若是有,找到环的起始点.关于第一点,可以参考之前的博客 Linked list cycle.

LeetCode Linked List Cycle II 超时问题

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up:Can you solve it without using extra space? 题目意思很简单,判断链表是否有环,若有,返回环的位置. 一开始,用了原来I的方法,结果会出现超时. public ListNode detectCycle(ListNode head) { boole

[LeetCode] Linked List Cycle II 单链表中的环之二

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 这个求单链表中的环的起始点是之前那个判断单链表中是否有环的延伸,可参见我之前的一篇文章 (http://www.cnblogs.com/grandyang/p/4137187.html). 还是要设

[LeetCode] Linked List Cycle II, Solution

Question : Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? Anaylsis : 首先,比较直观的是,先使用Linked List Cycle I的办法,判断是否有cycle.如果有,则从头遍历节点,对于每一个节点,查询是否在环里面,是

[LeetCode] Linked List Cycle II 链表环起始位置

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up:Can you solve it without using extra space? Hide Tags Linked List Two Pointers 开始犯二了一点,使用了node 的val 作为判断,其实是根据内存判断.找出链表环的起始位置,这个画一下慢慢找下规律便可以: 思路