首页 > 其他分享 >环形链表

环形链表

时间:2023-04-27 15:44:49浏览次数:36  
标签:slow ListNode 环形 fast next 链表 指针

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

 思路:

1、判断是否有环

定义两个指针,一快一慢,从头指针开始遍历,快指针不为空或者快指针的下一个结点不为空,则有环

2、返回环的位置

 

找到快、慢指针相遇的点,根据公式x=(n-1)(z+y)+z,n-1代表快指针转了多少圈,则x=z。

再定义两个指针,一个从头结点开始,另一个从fast指针与slow指针相遇的结点开始,两个指针相等时,为环形入口结点。

需要注意的点:

1、

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head;
        ListNode* slow=head;
        while(fast!=NULL&&fast->next!=NULL)//如果有环则在循环内部,无环则跳出循环
        {
            fast=fast->next->next;
            slow=slow->next;

            if(fast==slow)
            {
                ListNode* index1=fast;//快慢指针均可,因为接下来要步进一个指针
                ListNode* index2=head;

                while(index1!=index2)
                {
                    index1=index1->next;
                    index2=index2->next;
                }

                return index2;
            }



        }

        return NULL;
        
    }
};

 

标签:slow,ListNode,环形,fast,next,链表,指针
From: https://www.cnblogs.com/gaishuobulao/p/17359111.html

相关文章

  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......
  • 合并两个有序链表--Python实现
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:defmergeT......
  • 链表相交
     题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 需要注意的点:1、定义的两个指针在遍历完链表的长度后,要重新指向头结点2、让长、短链表的尾端对齐3、相交意味着指针相同 classSolution{p......
  • 删除链表的倒数第N个节点
    题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]本题需要使用双指针,需要注意的点:1、双指针都指向头结点2、快指针提前移动n+1个点3、结束条件:快指针指向空指针4、慢指针指向要删除结点的前一个结点5、删除结点时......
  • 循环控制:链表和数组
    循环是常用的流程环节。1//链表控制2//链表控制的优点,是通过指针来定位,那么循环的过程中,即是可变的,实时性很强。3vartmp*datastruct.ListNode4tmp=&datastruct.ListNode{Val:-1,Next:nil}56i:=07fornode:=tmp;node!=......
  • 两两交换链表中的结点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)  步骤: classSolution{public:ListNode*swapPairs(ListNode*head){ListNode*dummyHead=newListNode(0);//......
  • 23-4-25--链表--一元多项式求导
    设计函数求一元多项式的导数。输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。输入样例:34-5261-20 ......
  • 分治算法:剑指 Offer 25. 合并两个排序的链表
    题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 限制:0<=链表长度<=1000 解题思路:    classSolution{publicListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedum=newListNode......
  • #yyds干货盘点# LeetCode面试题:分隔链表
    1.简述:给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例1:输入:head=[1,4,3,2,5,2],x=3输出:[1,2,2,4,3,5]示例2:输入:head=[2,1],x=2输出:[1,2......
  • [Leetcode]返回链表开始入环的第一个节点
    力扣链接思路一:快慢指针法一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.最终代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){......