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

2、Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

3、Given a linked list, return the length of the cycle, if there is no cycle, return 0;

题目要求:

1、给一个链表,判断它是否存在环;

2、给一个链表,如果它存在环,请返回环的起点,否则,返回NULL;

3、给一个链表,如果它存在环,请返回环的长度,否则,返回0;

解题思路:

1、判断是否存在环?

方法1:增加一个set容器,遍历链表,将各个结点依次加入Set集合中,如果该节点已存在集合中,说明存在环;如果遍历结束后,发现没有重复的结点,则说明没有环。

方法2:无需额外空间,设置两个指针p1,p2,从头结点开始,一个走一步,p1=p1->next;,一个走两步,p2=p2->next->next,如果存在环,那么两个指针肯定会相遇;如果走得快的指针p2到达了终点,说明没有环。

2、如何求环的起点和环的长度呢?

设链表起点距离环的起点距离为a,圈长为n,当p1和p2相遇时,相遇点距离环起点距离为b,此时b已绕环走了k圈,则

p1走的距离为a+b;

p2速度为p1的两倍,p2走的距离为2*(a+b);

p2走的距离为a+b+k*n=2*(a+b),从而a+b=k*n

即当p1走a步,p2走(k*n-b)步,当k=1时,则为(n-b)步;

因此如何求环的起点?把p1拉回起点重新出发,p2从相遇点继续走,p1,p2每次均走一步,a步后,p1到达起点,p2也刚好到圈的起点。

如何求环的长度?相遇后,p2再走一圈并统计长度就是圈长。

参考代码:

1、判断是否存在环?

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:bool hasCycle(ListNode *head) {set<ListNode*> psets;for(ListNode *p=head;p!=NULL;p=p->next){if(psets.find(p)!=psets.end())return true;psets.insert(p);}return false;}
};

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:bool hasCycle(ListNode *head) {
//        if(head==NULL || head->next==NULL)
//            return false;ListNode *p1=head;ListNode *p2=head;while(p2 && p2->next){p1=p1->next;p2=p2->next->next;if(p1==p2)return true;}return false;}
};

2、求环的起点

/*** 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) {ListNode *p1,*p2;p1=head;p2=head;while(p2 && p2->next){p1=p1->next;p2=p2->next->next;if(p1==p2){// p1 points back to head,p2 still stand where they have met// p1,p2 take the same steps// when they meet again, that's where the cycle startsp1=head;while(p1!=p2){p1=p1->next;p2=p2->next;}return p1;}}return NULL;}
};

3、求环的长度

/*** 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) {ListNode *p1,*p2;p1=head;p2=head;while(p2 && p2->next){p1=p1->next;p2=p2->next->next;if(p1==p2){// if p2 cycles around,then the length of cycle can be countedListNode *p=p2->next;int length=1;while(p!=p2){length++;p2=p2->next;}return length;}}return 0;}
};

(LeetCode 141/142)Linked List Cycle相关推荐

  1. 再也不怕女朋友问我二分查找了!【手绘漫画】图解二分查找(修订版)(LeetCode 704题)

    文章目录 图解算法与数据结构 1.前言 2.代码 3.实例(LeetCode 704题) 图解算法与数据结构 1.前言 上次讲到的更的二分查找模板在很多地方让我使用起来不是特别的舒服,感谢B站上的y大 ...

  2. 环形链表【手绘漫画】面试必考之双指针(LeetCode 141)

    文章目录 图解算法与数据结构 1.前言 2.实例 3.正文 4.代码 图解算法与数据结构 1.前言 今天开始的是双指针! 下面一起来看看吧!!! 让我们从一个经典问题开始: 环形链表进阶版[手绘漫画] ...

  3. golang中的栈(LeetCode刷题)

    栈的模拟(LeetCode刷题用法) func main() {stack := make([]string, 0)stack = append(stack, "1" )stack ...

  4. 用数组建立二叉树(LeetCode二叉树测试)

    我在做leetcode上的二叉树题目,经常会报错,但是又不知道错在哪里,于是我想到在vscode上调试我写的代码,于是我参考了leetcode 二叉树的建立.释放内存.层序遍历输出,C++ 做了简化, ...

  5. JAVA程序设计:IPO(LeetCode:502)

    假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最多 k 个不同 ...

  6. 动态规划:01背包问题例题(leetcode+cpp实现)

    文章目录 分割等和子集 最后一块石头的重量 前情回顾: 动态规划(4):01背包问题详解 分割等和子集 力扣传送门: https://leetcode.cn/problems/partition-eq ...

  7. leetcode day5 -- Reorder List Linked List Cycle II

    1.  Reorder List Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln ...

  8. JAVA程序设计:蛇梯棋(LeetCode:909)

    在一块 N x N 的棋盘 board 上,从棋盘的左下角开始,每一行交替方向,按从 1 到 N*N 的数字给方格编号.例如,对于一块 6 x 6 大小的棋盘,可以编号如下: 玩家从棋盘上的方格 1 ...

  9. 算法题:鸡蛋掉落(leetcode 887题)

    题目: 鸡蛋掉落 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑. 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去. 你知道存在楼层 F ,满足 0 < ...

最新文章

  1. “叽里呱啦”说英语,这家公司要用AI增值语言输出能力
  2. SQL的多种JOIN
  3. Xshell连接Ubuntu
  4. LeetCode Merge k Sorted Lists 解决报告
  5. Controller FioriTest.view.LineItem couldn't be instantiated
  6. tcga癌症亚型获取_将亚型多态性与通用多态性相关联的危险
  7. winpcapp配置c++网口通讯_(经验)西门子PLC的Modbus TCP通讯的一些经验
  8. ccs4c语言用户手册,CCS v4.x快速入门:EasyDsp开发套件产品手册
  9. the android sdk location cannot be at the filesystem root
  10. 阿里涉足零售IoT的猜想
  11. SharpMap在web上的应用
  12. Java 注解Annotation总结二
  13. python3 linux
  14. 【工科数学分析】2021-10-07-工科数学分析叒复习(三)
  15. 计算机网络按网络的传输介质分类可以分为:广域网和无线网两种.,常用的网络传输介质类别和各自特点...
  16. python读取页眉页脚,python批量替换页眉页脚
  17. keil MDK AC5向AC6迁移后如何重定向printf
  18. 这5款微信小程序,实用又不占内存!
  19. Es6常见面试题必看!
  20. python在多继承中子类调用某个父类的同名方法之 super讲解(mro机制)***

热门文章

  1. Hi3516DV300 U-boot移植应用开发指南(1)
  2. 用xfire开发webservice实例
  3. racle的STRUCT和VARRAY的读写方法
  4. 为什么函数式语言会火
  5. 知识图谱基础知识之一——人人都能理解的知识图谱
  6. linux 监控命令
  7. POJ 1611 The Suspects
  8. MyEclipse中消除frame引起的“the file XXX can not be found.Please check the location and try again.”的错误...
  9. 01_8_Struts用DomainModel接收参数
  10. ReactNative的基本组件的认识