题目

142. Linked List Cycle II

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

There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail’s next pointer is connected to. Note that pos is not passed as a parameter.

Notice that you should not modify the linked list.

Follow up:

Can you solve it using O(1) (i.e. constant) memory?

Example 1:

Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.

Example 2:

Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.

Example 3:

Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.

Constraints:

  • The number of the nodes in the list is in the range [0, 104].
  • -105 <= Node.val <= 105
  • pos is -1 or a valid index in the linked-list.

解法一,用set存储对象

把每个节点存储到不可重复集合set中,判断是否存在即可。但是存储比较多,速度就会稍微慢一点。

# Definition for singly-linked list.
class ListNode:def __init__(self, x):self.val = xself.next = Noneclass LinkedListCycleII:def detectCycle(self, head: ListNode) -> ListNode:nodeSet = set()while head :if head in nodeSet:return headnodeSet.add(head)head = head.nextreturn Non

解法二,快慢指针

定义两个指针慢和快。 两者都是从头节点开始的,快是慢的两倍。 如果到达末尾,则表示没有周期,否则最终它将最终赶上周期中某个地方的慢速指针。

假设从第一个节点到开始循环的节点的距离为A,并且慢速指针行进为A + B。 快速指针必须经过2A + 2B才能赶上。 周期的大小为N。完整的周期也是相交的慢速指针经过的时间比慢速指针经过了多少。

A + B + N = 2A + 2B
N = A + B
根据我们的计算,慢速指针在遇到快速指针时会精确地经过整个周期,并且由于它最初在循环开始之前就经过了A,因此它必须经过A才能到达循环开始的点! 我们可以在头节点处启动另一个慢速指针,然后移动两个指针,直到它们在循环开始时相遇为止。

# Definition for singly-linked list.
class ListNode:def __init__(self, x):self.val = xself.next = Nonedef  detectCycleWithTwoPointer(self, head: ListNode) -> ListNode:slow, fast = head, headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast:slow2 = headwhile slow2 != slow:slow = slow.nextslow2 = slow2.nextreturn slowreturn None

算法:判断是否是循环链表,并返回循环链表开始节点Linked List Cycle II相关推荐

  1. 数据结构与算法作业3——约瑟夫环问题(循环链表)

     第二次作业: 习题2 载具杀手与时停高手(约瑟夫环问题) 著名绅士简尚夫有一项特殊的天赋,他可以摧毁任意一辆载具(载具杀手).他的朋友狄傲可以将时间暂停(时停高手).他俩玩一个游戏. 有N辆车,编号 ...

  2. 【刷算法】判断链表是否有环以及返回入环节点

    题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...

  3. Python创建一个循环链表、双向循环链表

    循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...

  4. SPFA算法判断负权环(bfs_spfa,dfs_spfa)

    判断给定的有向图中是否存在负环. 利用 spfa 算法判断负环有两种方法: 1) spfa 的 dfs 形式,判断条件是存在一点在一条路径上出现多次. 2) spfa 的 bfs 形式,判断条件是存在 ...

  5. (Miller Rabin算法)判断一个数是否为素数

    (Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...

  6. 建立循环链表c语言,循环链表C语言实现

    按照单链表的设计,稍加改动.和单向链表不一样的地方,头节点不指向NULL,而是指向自己head 循环链表的判满 1)判断next是不是头结点,2)判断size /* * CycleLinkList.h ...

  7. 【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环

    文章目录 用list来表示图,判断是否存在环 邻接表实现拓扑排序 用DFS(邻接矩阵) 来实现拓扑排序. 判断无向图顶点是否全部连通 判断图G中从顶点u到v是否存在简单路径 输出图G中从顶点u到v的所 ...

  8. AOJ GRL_1_C: All Pairs Shortest Path (Floyd-Warshall算法求任意两点间的最短路径)(Bellman-Ford算法判断负圈)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_C All Pairs Shortest Path Input ...

  9. 使用决策树分类算法判断一下你的Python水平

    决策树算法是一种常用的机器学习算法,既可以用于分类,也可以用于回归.决策树算法类似于程序设计语言中嵌套的多分支选择结构,根据不同的条件选择不同的分支路径,最终到达叶子节点,并给出单一输出结果. 决策树 ...

  10. c语言判断字符是否对称,2020-07-23(C语言)数据结构-试设计算法判断该链表的全部n个字符是否中心对称。...

    //设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型.试设计算法判断该链表的全部n个字符是否中心对称.例如xyx,xyyx都是中心对称. include incl ...

最新文章

  1. 使用结构体stuinf输入输出一个学生的信息
  2. 关于未来50年的工作与生活,三星联合未来学家们做出了这些预测
  3. 一篇为你讲透Yii2的widget这货
  4. 2_Python实现基于人脸特征的美颜算法(20181224)
  5. String 常量池
  6. Asp.net禁用site.Mobile.Master
  7. Sentinel(四)之工作主流程
  8. Classification Example
  9. java 504错误怎么解决_求助java.lang.NoClassDefFoundError怎么解决,报错信息如下
  10. devops_DevOps专业人员如何成为安全冠军
  11. hiho1096_divided_product
  12. Atitit 项目wechat微信截屏生成vcf通讯录384 个 384个人 42个节拍,平均每个8个人 技术点 im图像裁剪, ocr Tesseract Vcf格式 /wechatTel
  13. netstat 查看网络状态
  14. dog log 算子_图像特征之LoG算子与DoG算子
  15. LeetCode中等题之整数转罗马数字
  16. redhat linux 无线网卡,RedHat Linux 6.4安装RTL8188CUS无线网卡驱动
  17. python moving average_Python实现滑动平均(Moving Average)的代码教程
  18. excel如何快速从身份证号码中提取出生日期?
  19. ORA-31655,ORA-39154 Objects from foreign schemas have been removed from import
  20. 计算机主机清理步骤,教你4个C盘清理方法,去掉电脑90%垃圾文件

热门文章

  1. 安全结束线程 linux,启动线程以及安全终止线程
  2. [转]跨域资源共享 CORS 详解
  3. SOA概念的三个比喻
  4. Android 工具
  5. HDU_1874_畅通工程续_最短路问题
  6. 如何在 Project 里设置(创建)里程碑
  7. wdcp如何修改phpmyadmin导入 最大限制2048 KB
  8. JavaWeb-Servlet--day01(笔记)
  9. oracle 11g 01017,oracle 11G OEM 出现问题 ORA-01017: inv
  10. go mock mysql_go sqlmocks的使用