• LeetCode OJ:Linked List Cycle II(循环链表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.

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

    和前面那题类似,只不过这里要找到的是环开始的节点,看下面这张图(图是盗的):

    当fast以及slow指针在z处相遇的时候,可以得到一个计算式,关于两个指针走过的距离,有fast指针走过的距离是slow指针的2倍,那么有:

    a + b + c + b(fast) = 2 * (a + b)               =>                 a = c;

    那么从链表头在选一个指针,和slow指针一起走,正好可以在环的起始点处相遇,代码如下所示:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *detectCycle(ListNode *head) {
    12         if(!head) return NULL;
    13         ListNode * slow = head;   
    14         ListNode * fast = head;
    15         while(slow && fast){
    16             slow = slow->next;
    17             fast = fast->next;
    18             if(fast)
    19                 fast = fast->next;
    20             if(fast && slow &&fast == slow)
    21                 break;
    22         }
    23         if(fast == NULL) return NULL;
    24         ListNode * start = head;
    25         while(slow != start){
    26             slow = slow->next;
    27             start = start->next;
    28         }
    29         return slow;
    30     }
    31 };

    还有一篇博客对这个问题还有类似的衍生问题描述的比较清楚,mark一下

  • 相关阅读:
    [Re] Spring-4(SourceCode)
    [Re] Spring-3(JdbcTemplate)
    [Re] Spring-2(IOC+AOP)
    [Re] Spring-1(bean)
    08-MyBatis(2)
    08-传输层(7)
    07-传输层(6)
    06-传输层(5)
    05-传输层(4)
    ALS推荐算法
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4936633.html
Copyright © 2020-2023  润新知