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

链表相关的算法题(2)

链表相关的算法题(2)

  • 1、确定链表是否有环
  • 2、寻找环头

1、确定链表是否有环

题目链接
在这里插入图片描述
既然是判断环形指针,我们就可以利用快慢指针

实际上,慢指针走一步,无论快指针走多少步(大于1步),快慢指针都会在环中相遇。这里我们规定快指针走两步,并简单解释原理:

  1. 快指针走两步,慢指针走一步,相差1步
  2. 当慢指针走到环的头节点时,快指针已经在环中
  3. 但快慢指针的距离,一定是差值的倍数(1的倍数),所以,快慢指针,一定能在环中相遇

代码演示:

struct ListNode {int val;struct ListNode *next;
};
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {//找相遇点ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//相遇,有环return true;}}//出循环,无环return false;
}

2、寻找环头

题目链接

在这里插入图片描述

在这里,我们需知道一个结论:

如果使用快慢指针,快指针走两步,慢指针走一步。当快慢指针在环中相遇,相遇点到环头节点的距离,等于链表头节点到环头结点的距离。

下面给出证明:
请添加图片描述
其中,

  • E是环头结点的位置,M是快慢指针相遇的位置。指针运动的方向为逆时针
  • L为链表头节点到环头节点的距离
  • C为环形链表总长度
  • x为环头节点到相遇位置的距离,C-x为相遇位置返回到环头节点的距离

问题变为了:证明L等于C-x

当快慢指针相遇,慢指针走过的距离:
x1=L+xx1 = L + x x1=L+x
快指针有可能转了几圈,才相遇。快指针走过的距离:
x2=L+x+nC(n>=1)x2 = L + x + nC (n>=1) x2=L+x+nC(n>=1)
又有快慢指针距离关系:
x2=2∗x1x2 = 2 * x1 x2=2x1
得:
2∗(L+x)=L+x+nC(n>=1)2 * (L + x) = L + x + nC (n>=1) 2(L+x)=L+x+nC(n>=1)
化简,移项,得:
L=nC−x(n>=1)L = nC - x (n>=1) L=nCx(n>=1)
C - x ,得:
L=(n−1)C+C−x(n>=1)L = (n-1)C + C - x (n>=1) L=(n1)C+Cx(n>=1)
在环内,相差环长度的倍数,就是相遇。所以在环内,L等于C-x,得证。

代码演示:

struct ListNode {int val;struct ListNode *next;
};
typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){ListNode* pcur = head;while (pcur && slow){if (pcur == slow){return pcur;}pcur = pcur->next;slow = slow->next;}}}return NULL;
}
http://www.dtcms.com/a/572927.html

相关文章:

  • 10月谷歌新政 | 涉及真金游戏、约会社交、个人贷款、医疗健康等类别App
  • python实现语音转文本STT
  • 十大免费建站app做网站公司不给源码
  • 07.docker介绍与常用命令
  • 【Docker下部署高可用】StarRocks 存算一体架构高可用部署要点
  • 小型工厂怎么找外贸客户?
  • 【Android】正式打包发布
  • 寻找做网站的合作伙伴北京北京网址建设
  • PyTorch2 Python深度学习 - 模型保存与加载
  • 南京html5网站建设今天发生的重大新闻5条
  • 台州网站排名优化公司中国石油第一建设公司官网
  • JS原型和原型链
  • Rust 赋能图片批量处理:从 ImageKit 实现到行业前沿优化实践
  • ceph osd down排查
  • Android 14 系统启动流程深度解析:内置SD卡挂载流程
  • 【Qt】大数据量表格刷新优化--只刷新可见区域
  • 基于 React 的倒计时组件实现:暴露方法供父组件状态管理
  • 2.每日机器学习——张量(Tensors)
  • wordpress换php7出错内蒙古seo公司
  • 设计模式——桥接模式(bridge)
  • 阳光家园广州网站个人网站如何做即时支付
  • Arbess零基础学习 - 使用Arbess+GitLab实现.Net 项目构建/主机部署
  • 【数据结构】PriorityQueue优先队列:基于堆(heap)实现
  • PCB设计如何防止别人抄板?
  • macOS自定义安装PlatformIO Core
  • VSCode中Copilot的询问、编辑、代理有啥区别?
  • 二重积分器(Double Integrator)
  • APP与小程序分账系统是什么?资金管理新思路,合规高效分账
  • Hudi和Iceberg的Specification规范角度详细比较异同点
  • 临安网站建设杭州低价做网站