leetcode每日一题链表有环无环链表长度求解

2023-11-10 10:10

本文主要是介绍leetcode每日一题链表有环无环链表长度求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.链表有无环

采用快慢指针求解,指针slow和fast从链表头开始走,slow每次往后走一步,fast每次往后走两步,若链表有环则俩指针必定在环内相遇 

2.有环链表长度

如图所示,假设slow和fast在Pos处第一次相遇,join为环的入口,假设从表头Head到Join有l个节点,join沿逆时针到Pos有x个节点,环中有R个节点,显然fast走过的节点数是slow的两倍,那么有

                                                                             $$2(l + x) = l+nR+x$$                  (1)

其中$$n$$为一任意正整数,可以推出 

                                                                                      $$l=nR-x$$                           (2)

让fast和slow从Pos开始继续沿着逆时针走,同时用另外个指针p沿着Head一次走一步,到第二次相遇时fast比slow多走了一圈,而fast的速度刚好是slow的两倍,则slow刚好走了一圈,记下此时slow走过的节点数可以得到环内包含的节点数$$R$$,根据(2)可以得到,若slow从Pos走过$$l$$ 时刚好到达Join而此时p也刚好到达Join,记录下此时head走过的节点数$$l$$,则链表的长度为$$l+R$$

代码

struct Node {int data;Node* next;
};Node* IsCycle(Node *head)
{Node* slow = head;Node* fast = head;while (true) {if (fast == nullptr || slow == nullptr) {return nullptr;}slow = slow->next;fast = fast->next;if (fast == nullptr) {return nullptr;}fast = fast->next;if (fast == slow) {return fast;}}
}int LenList(Node* head)
{Node* Pos = IsCycle(head);if (Pos == nullptr) {return LenNonCycle(head);}int l = 0;int r = 0;bool rget = false;bool lget = false;Node* slow = Pos;Node* fast = Pos;Node* p = head;while(true) {slow = slow->next;if (!rget) {++r;}if (!lget) {++l;}fast = fast->next->next;if (fast == slow) {rget = true;}if (slow == p) {lget == true;}if (rget && lget) {return r + l;}}
}

 

这篇关于leetcode每日一题链表有环无环链表长度求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381999

相关文章

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-