zoukankan      html  css  js  c++  java
  • 【题解】【链表】【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?

    思路

    这题是Linked List Cycle的进阶版

    Given a linked list, determine if it has a cycle in it.

     1 bool hasCycle(ListNode *head) {
     2     if(head == NULL) return false; //带环链表还要考虑只有单个元素的情况
     3     ListNode *faster = head, *slower = head;
     4     while(faster->next != NULL && faster->next->next != NULL && slower->next != NULL){//直接判断faster->next->next != NULL会抛错
     5         faster = faster->next->next;
     6         slower = slower->next;
     7         if(faster == slower) 
     8             return true;
     9     }
    10     return false;
    11 }

    faster和slower相遇之后必然在环上,让slower再走一圈计算环的长度len。另让两个指针p1,p2从head开始走,p1比p2先走len步,这样当p2走到环开始处时,正好p1与p2第一次相遇。

     1 ListNode *detectCycle(ListNode *head) {
     2     if(head == NULL) return NULL;
     3     //带环链表要考虑只有单个元素的情况
     4     ListNode *faster = head, *slower = head;
     5     while(faster->next != NULL && faster->next->next != NULL && slower->next != NULL){//直接判断faster->next->next != NULL会抛错
     6         faster = faster->next->next;
     7         slower = slower->next;
     8         if(faster == slower){
     9             ListNode *p1 = head;//另让两个指针p1,p2从head开始走
    10             ListNode *p2 = head;
    11             slower = slower->next;//让slower再走一圈计算环的长度len
    12             p1 = p1->next;//设len是环的长度,p1比p2先走len步
    13             if(faster == slower) return faster;//自环
    14             while(faster != slower){
    15                 slower = slower->next;
    16                 p1 = p1->next;
    17             }
    18             while(p1 != p2){//当p1与p2第一次相遇时,正好p2走到环开始处
    19                 p1 = p1->next;
    20                 p2 = p2->next;
    21             }
    22             return p2;
    23         }
    24     }
    25     return NULL;
    26 }
  • 相关阅读:
    STM32 定时器用于外部脉冲计数
    幸福是怎么来的
    STM32 I/O的耐压问题,中断问题,以及如何在Keil (RVMDK) 中观察程序的执行时间
    STM32输入捕获简介
    STM32 直流减速电机控制
    2013 初始
    js 为字符串添加样式
    js 实现页面显示钟表
    JavaScript 入门总结
    ADO.NET基本数据库编程
  • 原文地址:https://www.cnblogs.com/wei-li/p/LinkedListCycleII.html
Copyright © 2011-2022 走看看