zoukankan      html  css  js  c++  java
  • LeetCode 142. 环形链表 II(Linker List Cycle II)

    题目描述

    给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

    说明:不允许修改给定的链表。

    进阶:
    你是否可以不用额外空间解决此题?

    解题思路

    分为三步:

    • 首先判断是否存在环,利用快慢指针法,从头节点开始快指针每次走两步,慢指针每次走一步,如果存在环则两指针必定会相遇,如果没有再次相遇则不存在环
    • 然后找到环中节点的个数,此时快指针已经处在环内,所以让其每次向前走一步,记录再次和慢指针相遇时走的步数即为环中节点个数
    • 找环入口节点时还是利用快慢指针,从头节点开始先让快指针走环中节点个数的步数,然后快慢指针同时向前移动,这样相遇时快指针恰好比满指针多走了一个环的长度,即指向了环入口节点

    代码

     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 == NULL) return NULL;
    13         ListNode *fast = head, *slow = head;
    14         int len = 0;
    15         while(fast->next && fast->next->next){
    16             fast = fast->next->next;
    17             slow = slow->next;
    18             if(fast == slow){
    19                 len = 1;
    20                 break;
    21             }
    22         }
    23         if(len == 0) return NULL;
    24         while(fast->next != slow){
    25             fast = fast->next;
    26             len++;
    27         }
    28         fast = head;
    29         slow = head;
    30         while(len-- > 0)
    31             fast = fast->next;
    32         while(fast != slow){
    33             fast = fast->next;
    34             slow = slow->next;
    35         }
    36         return fast;
    37     }
    38 };
  • 相关阅读:
    0008_Python变量
    shiro Filter过滤器管理197
    oracle 将一个数据库(A)的表导入到另一个数据库197
    top命令使用197
    SpringBoot下载Excel文件,解决文件损坏问题197
    java元注解197
    Content-Type
    centos7 下修改网络配置
    mint 20 install NVIDIA driver for 3080 via run
    使用numpy rot90操作image后,opencv cv2.rectangle 报错
  • 原文地址:https://www.cnblogs.com/wmx24/p/9468025.html
Copyright © 2011-2022 走看看