当前位置: 首页 > news >正文

阳光保险网站辽宁建设工程信息网 管网

阳光保险网站,辽宁建设工程信息网 管网,张家港本地论坛,温州网站制作哪家好❓142. 环形链表 II 难度:中等 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定…

❓142. 环形链表 II

难度:中等

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

示例 1:

在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

在这里插入图片描述

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

在这里插入图片描述

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [ 0 , 1 0 4 ] [0, 10^4] [0,104]
  • − 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^5 105<=Node.val<=105
  • pos 的值为 -1 或者链表中的一个有效索引

进阶:你是否可以使用 O ( 1 ) O(1) O(1) 空间解决此题?

💡思路:快慢指针

我们使用两个指针,slowfast,它们起始分别指向链表的头部head 和头部的下一个节点head.next

  • 随后,slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。
  • 如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。

如下图所示,设链表中环外部分的长度为 aslow 指针进入环后,又走了 b 的距离与 fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为: a + n ( b + c ) + b a+n(b+c)+b a+n(b+c)+b

在这里插入图片描述
根据题意,任意时刻,fast指针走过的距离都为 slow 指针的 2 倍。因此,我们有
a + ( n + 1 ) b + n c = 2 ( a + b ) a+(n+1)b+nc=2(a+b) a+(n+1)b+nc=2(a+b)
整理得:
a = c + ( n − 1 ) ( b + c ) a=c+(n−1)(b+c) a=c+(n1)(b+c)
我们会发现:从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离。

因此,当发现 slowfast 相遇后,我们让 fast 指向链表头部 headslow 指向slow 的下一个:

  • 随后, fastslow 每次向后移动一个位置
  • 最终,它们会在 入环点 相遇。

🍁代码:(Java、C++)

Java

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {if(head == null) return null;ListNode slow = head;ListNode fast = head.next;while(fast != null && fast.next != null){if(slow == fast) break;slow = slow.next;fast = fast.next.next;}if(fast == null || fast.next == null) return null;fast = head;slow = slow.next;while(slow != fast){slow = slow.next;fast = fast.next;}return slow;}
}

C++

/*** 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) {if(head == NULL) return NULL;ListNode* slow = head;ListNode* fast = head->next;while(fast != NULL && fast->next != NULL){if(slow == fast) break;slow = slow->next;fast = fast->next->next;}if(fast == NULL || fast->next == NULL) return NULL;fast = head;slow = slow->next;while(slow != fast){slow = slow->next;fast = fast->next;}return slow;}
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为链表中节点的数目。在最初判断快慢指针是否相遇时,slow 指针走过的距离不会超过链表的总长度;随后寻找入环点时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O ( N ) + O ( N ) = O ( N ) O(N)+O(N)=O(N) O(N)+O(N)=O(N)
  • 空间复杂度 O ( 1 ) O(1) O(1),我们只使用了 slow, fast 两个指针。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

http://www.yayakq.cn/news/920708/

相关文章:

  • 网站一年的费用上海住房与建设部网站
  • 哪个网站反盗版做的最好应用商店aso优化
  • 网站建设服务器选择做58同城网站花了多少钱
  • 网站空间在哪申请零基础源码建设网站
  • 可以做试卷的网站英语淘宝怎么优化关键词步骤
  • 高端企业网站公司网站设计就业压力
  • 无锡网站设1688黄页网品种大全2021
  • 一页式网站模板怎样把自己做的网站发到网上
  • 网站优化公司多少钱12380举报网站建设经验
  • 做南美生意做什么网站好企业网站建设的四大因素
  • php 用什么做网站服务器吗深圳网站制作十年乐云seo品牌
  • 嘉兴装修公司做网站线上渠道推广有哪些方式
  • 腾和企业网站管理系统商城版免费网站
  • 十大中文网站排名旅游手机网站模板
  • 徐州网页公司seo范畴有哪些
  • 铁岭做网站信息如何做公司简介介绍
  • 网站出现死链怎么办网站建设需求调研
  • 纯 flash 网站简述无线网络优化的流程
  • 哪些软件可以做网站设计苏州网络推广苏州网站建设
  • 青岛做网站排名微信公众号文章怎么导入wordpress
  • wordpress 企业整站图书购物网站开发的业务分析
  • 网站开发 seo世界500强企业排行榜
  • ai国外教程网站有电脑网站怎样建手机
  • 网站编辑器哪个好集团品牌网站建设
  • 手机欧美视频网站模板下载 迅雷下载 迅雷下载地址网站建设的模板
  • 加强网站的建设工作wordpress wp content
  • 做网站都需要什么工具wordpress忘记了密码
  • 东莞常平做网站公司制作app的专业公司
  • 滴滴优惠券网站怎么做微信开放平台介绍
  • 南通网站建设系统方案wordpress在线编辑慢