首页 > 其他分享 >力扣 142 环形链表

力扣 142 环形链表

时间:2023-03-18 15:24:41浏览次数:40  
标签:力扣 入环 slow 142 相遇 next 链表 NULL 指针

判断一个链表有无环,并且如果有环指出入环的位置。

1、判断有无环是通过 一快一慢指针来判断的。快的指针走每次走两步、慢的指针每次走一步,这样如果没有环的话他俩不会相遇。如果有环则一定相遇。

为什么一定相遇呢? 因为快指针走两步、慢指针走一步,快指针每次比慢指针多走一步,所以快指针必定能和慢指针相遇。

2、入环的位置:设开始距离入环位置为x ,入环位置到相遇的位置为y(顺时针),相遇位置距离入环位置(顺时针)为z。

根据快慢指针速度关系可得路程关系:  2*(x+y)=x+n(y+z)   解得x=(n-1)*(y+z)+y   ,即x与y相同。

为什么慢指针走的路程是 x+y 呢,为什么慢指针没有转圈呢?

注意慢指针入环的时候,快指针一定入环了。此时快指针和慢指针相遇的时候,慢指针肯定没走完一圈。如果慢指针走完一圈、快指针就走完两圈了,他们一定会在中途遇见的。把圆圈拉直就好理解了,当慢的走完一圈,快的走完两圈,肯定会相遇。(不懂就看卡尔的讲解)

为什么解出来是x=y呢 因为剩下的(n-1)*(y+z)是在那里转圈。结论就是当相遇的时候,相遇节点到入环的地方等于头节点到入环的距离。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
      ListNode *slow=head,*quick=head;
      if(slow==NULL)
      return NULL;
      int max=10000;
      while(1){
          if(max==0)
          break;
          max--;
          if(slow->next==NULL)
          return NULL;
          if(quick->next==NULL||quick->next->next==NULL)
          return NULL;
          slow=slow->next;
          quick=quick->next->next;
          if(slow==quick)
          break;
      }
      if(max==0)
      return NULL;
      ListNode *p=head;
      while(p!=slow){
          p=p->next;
          slow=slow->next;
      }
      return slow;
    }
};

 

标签:力扣,入环,slow,142,相遇,next,链表,NULL,指针
From: https://www.cnblogs.com/bhd123/p/17230832.html

相关文章

  • 数据结构-->链表_01
    首次书写链表有关的知识,先来明确什么是链表?链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的举一个形象化的现实生活中......
  • 【链表】复习/刷题 记录
    leetcode203.RemoveLinkedListElements/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode......
  • 力扣---剑指 Offer 09. 用两个栈实现队列
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHe......
  • day3 | 203. 移除链表元素,206. 反转链表,707. 设计链表
    203.移除链表元素 题目描述 给你一个链表的头节点head和一个整数val,删除链表中的那些存储的值为val的节点,并且返回新的头节点。 思路: 1.创建一个虚拟头节点,......
  • 力扣---24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,......
  • 力扣24 两两交换链表中的节点
    两两交换链表中的节点:先把一个链表分为两个链表,再把两个链表组成一个链表。注意最后可能有一个链表有剩余,但此时另一个链表的指针已经到了NULL,要再遍历一遍/提前记录(感觉......
  • 力扣197(MySQL)-上升的温度(简单)
    题目:表: Weather编写一个SQL查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。返回结果 不要求顺序 。查询结果格式如下例。 解题思路:方法一:使用......
  • 力扣196(MySQL)-删除重复的电子邮箱(简单)
    题目:表: Person编写一个SQL删除语句来删除所有重复的电子邮件,只保留一个id最小的唯一电子邮件。以任意顺序返回结果表。(注意:仅需要写删除语句,将自动对剩余结......
  • 力扣---2488. 统计中位数为 K 的子数组
    给你一个长度为n的数组nums,该数组由从1到n的不同整数组成。另给你一个正整数k。统计并返回nums中的中位数等于k的非空子数组的数目。注意:   数组的......
  • 1425. 带限制的子序列和
    题目描述数组值可以是负,需要返回一个非空的子序列和的最大值。其中对子序列的要求是相邻两个元素的原始下标不能超过kf1-dp+单调队列优化基本分析1.怎么联想到dp?对某......