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

LeetCode142 环形链表

时间:2022-10-03 00:55:38浏览次数:67  
标签:head slow ListNode 环形 fast next 链表 LeetCode142

 

 

 

idea:对于有环结构的链表,判断环结点位置,开始想到遍历链表,直到某一个结点出现第二遍,所以要进行比对的过程,想到前面学到利用哈希表解决相交链表,可以在这使用。不过对于为什么使用_set不太清楚,哈希表的操作及原理下来也要好好补一下

 

 

/**  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNode(int x) : val(x), next(NULL) {}  * };  */ class Solution { public:     ListNode *detectCycle(ListNode *head) {         unordered_set<ListNode*> hash;    //创建哈希表         while(head!=NULL){        //判断是否有环结构             if(hash.count(head))        //与已有元素进行比对                 return head;                       hash.insert(head);        //录入哈希表             head=head->next;         }           return NULL;     } }  

复杂度分析

时间复杂度:O(N)O(N),其中 NN 为链表中节点的数目。我们恰好需要访问链表中的每一个节点。

空间复杂度:O(N)O(N),其中 NN 为链表中节点的数目。我们需要将链表中的每个节点都保存在哈希表当中。

 

 

  进阶:双指针。 idea:具体是用快慢指针相遇问题,通过数学计算来解决问题,具体算法如下  

 

 代码实现:

class Solution { public:     ListNode *detectCycle(ListNode *head) {        ListNode* fast=head, *slow=head, *p=head;        while(fast!=NULL && fast->next!=NULL && fast->next->next!=NULL){             fast=fast->next->next;             slow=slow->next;            if(fast==slow){                while(p!=slow){                    p=p->next;                    slow=slow->next;                }                return p;            }        }        return NULL;     } };

 

复杂度分析

时间复杂度:O(N)O(N),其中 NN 为链表中节点的数目。在最初判断快慢指针是否相遇时,\textit{slow}slow 指针走过的距离不会超过链表的总长度;随后寻找入环点时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O(N)+O(N)=O(N)O(N)+O(N)=O(N)。

空间复杂度:O(1)O(1)。我们只使用了 \textit{slow}, \textit{fast}, \textit{ptr}slow,fast,ptr 三个指针。

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:head,slow,ListNode,环形,fast,next,链表,LeetCode142
From: https://www.cnblogs.com/Ting-LOVE/p/16749853.html

相关文章

  • 1105 链表合并——25分
    给定两个单链表L1=a1→a2→⋯→an−1→an和L2=b1→b2→⋯→bm−1→bm。如果n≥2m,你的任务是将⽐较短的那个链表逆序,然后将之并⼊⽐较⻓的那个链表,得到⼀个形如a1→a2......
  • LeetCode86 分隔链表
     idea:烦死了,这个题一直因为创立的指针为空,或者接入结点方法不对,结果将两个小链表搞混乱了,不过具体思路ok。将小值结点成一组,大值结点成一组,最后在首尾相连,实现起来也比......
  • LeetCode21 合并两个有序链表
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 (注意给出的三个实例,第一次由于没有注意到另外两个实例,忘记考虑一......
  • Java中队列和链表性能对比-ArrayList和LinkedList
    本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。 具体代码如下,可以直接运行importjava.util.ArrayList;importjava.util.LinkedList;importja......
  • 链表-2. 两数相加
    之前没有做过链表,这题我一提交就报错,后面发现需要用链表这种数据结构返回在网上查了下链表的概念,做完了它给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按......
  • 【code基础】链表问题总结
    数组和链表的区别数组:所有元素都连续的存储于一段内存中,且每个元素占用的内存大小相同。数组具备了通过下标快速访问数据的能力增加数组容量需要先申请一块新的内存,......
  • LeetCode160 相交链表
       idea:比较相同信息,首先想到用嵌套for循环解决,方法比较简单,不过时间复杂度高 /** * Definition for singly-linked list. * struct ListNode { *......
  • LeetCode 206 反转链表
    给你单链表的头节点head,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出......
  • 【c语言编程基础】结构体单向链表的基本操作
    前言 关注点 code#include<stdio.h>#include<stdlib.h>#include<string.h>//strcat#defineSize4typedefstructTable{intlen;intsize;......
  • android面试题--单链表反转
     //定义链表类classNode{intdata;Nodenext;}voidmain(){//第一步:新建链表Nodefive=newNod......