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

Can you solve it without using extra space?

每个节点再开辟一个属性存放是否访问过,这样遍历一遍即可知道是否有环。

但为了不增加额外的空间,

可以设置两个指针,一个一次走一步,另一个一次走两步,如果有环则两个指针一定会再次相遇,反之则不会。

C++:

 1 class Solution {
 2 public:
 3     bool hasCycle(ListNode *head) {
 4         if(head==NULL||head->next==NULL) return 0;
 5
 6         ListNode *p=head;
 7         ListNode *q=head;
 8         int flag=0;
 9         while(p->next)
10         {
11             if(p->next==q)
12             {
13                 flag=1;
14                 break;
15             }
16             p=p->next;
17             if(p->next==NULL)
18                 break;
19             p=p->next;
20             q=q->next;
21         }
22         if(flag==1)
23             return 1;
24         else
25             return 0;
26     }
27 };

Python:

 1 # Definition for singly-linked list.
 2 # class ListNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.next = None
 6
 7 class Solution:
 8     # @param head, a ListNode
 9     # @return a boolean
10     def hasCycle(self, head):
11         if head is None:
12             return False
13         p1=head
14         p2=head
15         while True:
16             if p1.next is not None:
17                 p1=p1.next.next
18                 p2=p2.next
19                 if p1 is None or p2 is None:
20                     return False
21                 elif p1==p2:
22                     return True
23             else:
24                 return False
25         return False

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?

当fast与slow相遇时,

slow肯定没有遍历完链表,而fast已经在环内循环了$n$圈($1 \leq n$)。假设slow走了$s$步,则fast走了$2s$步(fast步数还等于$s$加上在环上多转的$n$圈),设环长为$r$,则:

2s=s+nr
s=nr

设整个链表长$L$,环入口点与相遇点距离为$a$,起点到环入口点的距离为$x$,则

x+ax=nr=(n–1)r+r=(n−1)r+L–x
x=(n−1)r+(L–x–a)

$L – x – a$为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于$n-1$圈内环+相遇点到环入口点,

于是我们可以从{head}开始另设一个指针{slow2},两个慢指针每次前进一步,它俩一定会在环入口点相遇。

分析来自 ACM之家。

 1 class Solution {
 2 public:
 3     ListNode *detectCycle(ListNode *head) {
 4         if(head==NULL||head->next==NULL) return NULL;
 5         ListNode *p=head;
 6         ListNode *q=head;
 7         while(p->next&&p->next->next)
 8         {
 9             q=q->next;
10             p=p->next->next;
11             if(q==p)
12             {
13                 q=head;
14                 while(q!=p)
15                 {
16                     p=p->next;
17                     q=q->next;
18                 }
19
20                 return q;
21             }
22         }
23
24         return NULL;
25     }
26 };

转载于:https://www.cnblogs.com/jawiezhu/p/4401072.html

【leetcode】Linked List Cycle I II相关推荐

  1. 【LeetCode】剑指 Offer 59 - II. 队列的最大值

    [LeetCode]剑指 Offer 59 - II. 队列的最大值 文章目录 [LeetCode]剑指 Offer 59 - II. 队列的最大值 package offer;import java ...

  2. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串

    [LeetCode]剑指 Offer 58 - II. 左旋转字符串 文章目录 [LeetCode]剑指 Offer 58 - II. 左旋转字符串 一.字符串切片 二.列表遍历拼接 三.字符串遍历拼 ...

  3. 【LeetCode】剑指 Offer 32 - II. 从上到下打印二叉树 II

    [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 文章目录 [LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II 一.层序遍历 BFS 一. ...

  4. 【LeetCode】剑指 Offer 55 - II. 平衡二叉树

    [LeetCode]剑指 Offer 55 - II. 平衡二叉树 文章目录 [LeetCode]剑指 Offer 55 - II. 平衡二叉树 一.后序遍历 + 剪枝(从底至顶) 一.后序遍历 + ...

  5. 【LeetCode】剑指 Offer 68 - II. 二叉树的最近公共祖先

    [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 文章目录 [LeetCode]剑指 Offer 68 - II. 二叉树的最近公共祖先 一.DFS 一.DFS 祖先的定义 ...

  6. 【LeetCode】剑指 Offer 57 - II. 和为s的连续正数序列

    [LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列 文章目录 [LeetCode]剑指 Offer 57 - II. 和为s的连续正数序列 一.求和公式 二.滑动窗口(双指针 ...

  7. 【leetcode】963. Minimum Area Rectangle II

    题目如下: Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from ...

  8. 【leetcode】搜索二维矩阵 II

    题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 ma ...

  9. 【Leetcode】552. 学生出勤记录 II

    552. 学生出勤记录 II 题目描述 解题思路 题目描述 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent ...

最新文章

  1. 计算机桌面文件管理窗口,隐藏Win10此电脑窗口的6个额外文件夹
  2. GIt版本回退还不会用?轻松学会不怕失误
  3. ASP.NET中的状态管理
  4. 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题
  5. php两个字符串怎么比较,php比较两个字符串的函数strcasecmp()
  6. JS不能向WASM传递数组?
  7. 人物-李彦宏:李彦宏
  8. 维视智造机器视觉表面缺陷检测技术
  9. 阿里面试题:鹿晗发布恋情,为什么微博挂了?
  10. C语言学习(十)C语言中的小数
  11. 安卓App自启动,两种不同的方式!!!支持到安卓4.4
  12. Kaggle所有量化金融竞赛汇总。
  13. 小米盒子为什么搜不到电视家?电视安装包解析错误解决方案
  14. python读取7个数(1-50)的整数值_python每日一题总结7
  15. mysql 中自增的起始值和步长_MySQL设置自增初始值和步长
  16. ANSYS中各个单元的思考和分析(杆和梁)
  17. 测测你的金钱观爱情观事业观
  18. csv格式(csv格式怎么编辑)
  19. 相似度度量:欧氏距离与余弦相似度(Similarity Measurement Euclidean Distance Cosine Similarity)...
  20. NVR –D款设备如何将4路拓展成6路?

热门文章

  1. 数据挖掘原理与算法:练习题1
  2. 测试环境搭建流程_案例解析:一个完整的项目测试方案流程,应该是怎么的?...
  3. linux 磁盘扩容_当LINUX服务器磁盘空间不够时如何进行磁盘扩容?
  4. php类对象无法转还子符串问题,php – 类stdClass的对象无法转换为字符串
  5. nc65语义模型设计_完整word版,NC数据加工做语义模型
  6. python 制作高斯mask_【趣味案例】用Python制作各种酷炫词云图,原来这么简单!...
  7. 14、ListView案例
  8. 生成,保存和转换pcd点云文件
  9. 找不到具有指定ID的对话框类解决方法
  10. 如何安装vscode网页版_Windows10专业版/企业版如何安装Microsoft store