leetcode每日一题链表有环无环链表长度求解
1.链表有无环
采用快慢指针求解,指针slow和fast从链表头开始走,slow每次往后走一步,fast每次往后走两步,若链表有环则俩指针必定在环内相遇
2.有环链表长度
如图所示,假设slow和fast在Pos处第一次相遇,join为环的入口,假设从表头Head到Join有l个节点,join沿逆时针到Pos有x个节点,环中有R个节点,显然fast走过的节点数是slow的两倍,那么有
(1)
其中为一任意正整数,可以推出
(2)
让fast和slow从Pos开始继续沿着逆时针走,同时用另外个指针p沿着Head一次走一步,到第二次相遇时fast比slow多走了一圈,而fast的速度刚好是slow的两倍,则slow刚好走了一圈,记下此时slow走过的节点数可以得到环内包含的节点数,根据(2)可以得到,若slow从Pos走过
时刚好到达Join而此时p也刚好到达Join,记录下此时head走过的节点数
,则链表的长度为
代码
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每日一题链表有环无环链表长度求解相关推荐
- Leetcode每日一题:147.insertion-sort-list(对链表进行插入排序)
思路:因为链表的特性,插入排序无法从当前元素往前遍历,所以这里直接从头开始查找插入位置,分头部插入.中间插入和尾部插入: ListNode *insertionSortList(ListNode *h ...
- Leetcode每日一题:328.odd-even-linked-list(奇偶链表)
思路:同时分两个子链表分别向后连接属于它们的节点,遇到NULL节点时将两者连接即可: class Solution {public:ListNode *oddEvenList(ListNode *he ...
- Leetcode每日一题:83.remove-duplicates-from-sorted-list(删除排序链表中的重复元素)
思路:两个指针pre和cur,用cur遍历链表,pre指向cur前面的非重复元素: class Solution {public:ListNode *deleteDuplicates(ListNode ...
- Leetcode每日一题:剑指offer22.lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof(链表中倒数第k个节点)
思路:同上一道题,快慢指针问题: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *nex ...
- 【LeetCode每日一题】——109.有序链表转换二叉搜索树
文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...
- LeetCode 每日一题 3. 无重复字符的最长子串
LeetCode 每日一题 3. 无重复字符的最长子串 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创 ...
- Leetcode每日一题——思路小记
文章目录 LeetCode每日一题 golang T15 2020.6.12 三数之和,双指针的运用 T70 2020.6.13 斐波那契数列 T1014 2020.6.17 最佳观光:双指针,计算公 ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- 【LeetCode每日一题】810. 黑板异或游戏
[LeetCode每日一题]810. 黑板异或游戏 题目: 黑板上写着一个非负整数数组 nums[i] .Alice 和 Bob 轮流从黑板上擦掉一个数字,Alice 先手.如果擦除一个数字后,剩余的 ...
- 【Leetcode每日一题】118. 杨辉三角(水题)
Leetcode每日一题 题目链接: 118. 杨辉三角 难度: 简单 解题思路: 无.见代码. 题解: class Solution:def generate(self, numRows: int) ...
最新文章
- 项目进度,你汇报清楚了么?
- 四川300家旅游企业将用上阿里云
- 央企名录、央企排名——国务院国有资产监督管理委员会央企名录
- Activiti最全入门教程
- SpringBoot(入门)
- html下移,jQuery实现元素的上移下移删除
- 监控系统选型,这篇不可不读
- 10g手动创建数据库
- 微信端php 开发技术要求,PHP微信开发技术 - WebFalse文档托管平台
- 如何应用大数据分析平台
- STM32F7 SAI驱动
- 传输层协议、应用层协议
- 基于51单片机制作的基础四轮蓝牙小车(含代码)
- 抽象类和接口的异同点
- 2022-2027中国内科缝合线行业应用形势与需求前景预测报告
- design pattern scard
- 计算机网络-cisco选择题
- C语言编程判断输入的英文字母是星期几
- 闫令琪:Games101 现代计算机图形学-光线追踪(三):渲染方程和路径追踪path ray tracing 作业Assignment07解析
- w7电脑蓝屏怎么解决_教您电脑蓝屏怎么办