1、如何判断一个链表是否有环?

2、如果链表为存在环,如果找到环的入口点?

1.限制与要求

  • 不允许修改链表结构。
  • 时间复杂度O(n),空间复杂度O(1)。

2.思考

2.1判断是否有环

如果链表有环,那么在遍历链表时则会陷入死循环,利用这个特征,我们可以设计这样的算法。

  • 使用一个slow指针,一个fast指针。
  • slow指针一次往后遍历以1个节点,fast指针一次往后遍历2个节点,一直做这样的操作。

  • 如果fast指针在遍历过程中,遍历到了NULL节点说明链表没有环。

  • 否则当slow指针和falst指针相同,则说明环有节点。

2.2环的入口节点

我们假定链表头到环入口的距离是len,环入口到slow和fast交汇点的距离为x,环的长度为R。slow和fast第一次交汇时,设slow走的长度为:d = len + x,而fast走的长度为:2d = len + nR + x,(n >= 1),从而我们可以得知:2len + 2x = len + nR + x,即len = nR - x,(n >= 1),于是我们可以得到这样的算法。

  • 使用一个cur指针指向链表头节点,一个inter指针指向第一次的交汇点。

  • cur指针和inter指针一起往后遍历。

  • cur指针和inter指针相等时,cur和inter指针指向的就是环的入口节点。

inter指针在遍历过程中可能多次(n >= 1)经过环入口节点,但当cur指针第一次达到入口节点时,inter指针此时必然也指向入口节点。

class Node():
def __init__(self,item):
self.item =item
self.next=None def test(head):
low = head
high = head
cur = None
if head==None:
return False
while high.next!=None and high.next.next!=None:
low = low.next
high = high.next.next
if low==high:
cur = low
l = head
while cur.next:
cur=cur.next
l=l.next
if cur==l:
return l.item
return False node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node4 = Node(4)
node5 = Node(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node2 t=test(node1)
print(t) 判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。
使用哈希表,即python中的字典。先遍历一个链表,并将链表内容放入字典。再遍历另外一个链表,看遍历到的位置是否存在于字典中,存在则返回当前结点。若遍历结束仍不存在则返回空。检索复杂度为O(m+n),空间复杂度O(m+n)

判断单链表是否有环,并找出环的入口python的更多相关文章

  1. 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等

    出题:判断一个单向链表是否有环,如果有环则找到环入口节点: 分析: 第一个问题:使用快慢指针(fast指针一次走两步,slow指针一次走一步,并判断是否到达NULL,如果fast==slow成立,则说 ...

  2. 如何判断单链表是否存在环 & 判断两链表是否相交

    给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针sl ...

  3. 转 java - 如何判断单链表有环

    转自 https://blog.csdn.net/u010983881/article/details/78896293 1.穷举遍历 首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点 ...

  4. [LeetCode] Linked List Cycle II 单链表中的环之二

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

  5. 单链表是否有环的问题解决与讨论(java实现)

    单链表是否有环的问题经常在面试中遇到,一般面试中会要求空间为O(1);再者求若有环,则求环产生时的起始位置. 下面采用java实现. //单链表class ListNode{ int val; Lis ...

  6. [LeetCode] 142. Linked List Cycle II 单链表中的环之二

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

  7. [CareerCup] 2.6 Linked List Cycle 单链表中的环

    2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of ...

  8. C# 判断一个单链表是否有环及环长和环的入口点

    1.为什么写这个随笔? 前几天参加一个电面,被问到这个问题,想总结一下. 2.为什么标题强调C#? 想在网上看看代码,却没找到C#版的,于是自己用C#实现一下. 一.解决问题的思路 1.一种比较耗空间 ...

  9. [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环

    题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...

随机推荐

  1. FTP 服务器在WIN10上的搭建及服务端下载文件实例

    1.搭建 (1)控制面板--->程序----->将FTP服务器打勾 (2)输入iis,或者右键桌面-->管理-->服务和应用程序--->internet informat ...

  2. QQ企业通----类库的设计----UDPSocket组件等

    知识点: IPEndPoint    将网络端点表示为 IP 地址和端口号. UdpClient   提供用户数据报 (UDP) 网络服务. UdpClient对象.Close 关闭 UDP 连接. ...

  3. P1060 爱丁顿数

    P1060 爱丁顿数 转跳点:

  4. Arch-base-vs-iso

    Arch-base-vs-iso 通常绝大多数的Linux分发版的iso镜像本身(*.iso文件都有约2Gb上下)都可以直接启动电脑并运行完整的Linux桌面系统. 极少数的Linux发行版仅提供命令 ...

  5. Linux远程上传文件

    #对拷文件夹 (包括文件夹本身) scp -r /home/slk root@192.168.1.5:/home # 对拷文件并重命名 scp /home/a.txt root@192.168.1.5 ...

  6. php截取指定两个字符之间的字符串

    //截取指定两个字符之间的字符串 public function cut($begin,$end,$str){ $b = mb_strpos($str,$begin) + mb_strlen($beg ...

  7. 微信小程序自定义组件-下拉框

    这个是网址https://www.cnblogs.com/zjjDaily/p/9548433.html 微信小程序之自定义select下拉选项框组件 知识点:组件,animation,获取当前点击元 ...

  8. HDU1054-Strategic Game

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. Centos 7 安装与卸载MYSQL5.7

    先介绍卸载防止重装 yum方式 查看yum是否安装过mysqlyum list installed mysql*如或显示了列表,说明系统中有MySQL yum卸载 根据列表上的名字 yum remov ...

  10. Express - 采用bcryptjs进行密码加密

    1.安装bcryptjs模块 npm install bcryptjs --save 2.在需要加密的模块中引入bcryptjs库    require('bcryptjs');   实战 : /** ...