概念

快慢指针是指移动的步长,即每次向前移动速度的快慢。(例如,让快指针每次沿链表向前移动2,慢指针每次向前移动1)

应用

1.判断单链表是否存在环。如果快指针到达NULL,说明链表以NULL结尾,不存在环。如果快指针追上慢指针,则表示有环。

struct list_node
{int data;list_node* next;
};bool is_loop(list_node* head)
{list_node* n1 = head;list_node* n2 = head;while (n2->next != NULL){n1 = n1->next;n2 = n2->next->next;if (n1 == n2)return true;}if (n2->next == NULL)return false;
}

2.寻找循环链表的入口

将设链表长为L,起始点到环入口长度为a,环长为r,则L=r+a;如上图。在快指针进入到环到慢指针进入环前的这段时间,若环的长度较短,也许快指针已经走了好几圈。然后慢指针进入环,设慢指针和快指针相遇时,慢指针在环内走了X步,走的总步数为S步(S=a+X),此时快指针在环内走了n圈加X步,即为nr+X步,其中n最少为1,走的总步数为:nr+X+a步。由于快指针走的总步数为慢指针走的总步数的两倍,所以nr+X+a=(X+a)*2的X+a=nr.

即a=nr-X=(n-1)r+r-X

结论:环入口距离起点的距离(a)和相遇点距离环入口的距离(r-x)相差整数倍的r.

故让慢指针回到起点,快指针从相遇点开始继续走,步长都为1,则两者再相遇时,即为环入口。此时慢指针走了a步,快指针走了a步((n-1)r+r-X);

struct list_node
{int data;list_node* next;
};
list_node * FindBeginning(list_node* head)
{list_node*n1 = head;list_node*n2 = head;while (n2->next != NULL){n1 = n1->next;n2 = n2->next->next;if (n1 == n2)break;}if (n2->next == NULL)return NULL;    //没有相遇,没有环n1 = head;    ///n1从head 开始移动,n2从相遇点开始移动。while (n1 != n2){n1 = n1->next;n2 = n2->next;}return n2;
}

3.在有序链表中寻找中位数。原理:快指针移动速度是慢指针移动速度的两倍。所以快指针到达链表尾时,慢指针到达中点。(需要判断链表节点奇偶数)如果快指针移动x步到达表尾则为奇数。若为倒数第二个节点则为偶数(可根据规则返回上中位或下中位或上下一半);

4.两个单向链表判断他们是否相交

思路:首先用快慢指针判断是否有环

1)如果都没有环,如果两个单链表有公共结点,则两个单链表从某个结点开始,他们的next指向同一结点。(由于是单链表结点,每一结点只有一个next,所以从第一个公共结点开始,他们所有结点都是重合的)。既若两个单链表的末尾结点相同则相交。寻找第一个相交结点的方法:

a.在其中一个单链表上顺序遍历每个结点,每遍历一个结点,在另外一个链表上顺序遍历每个结点。

时间复杂度(O(mn))

b.首先两个链表各遍历一次求表长l1,l2,两链表差为l.然后现在长的链表上遍历L,然后同步遍历,第一个相同的结点就是公共结点。时间复杂度(O(m+n))

2)如果一个存在环,另外一个不存在环则不可能相交。

3)如果利用快慢指针发现两单链表都存在环,则判断一个链表上快慢指针相遇的那个结点是否在另一个链表上。如果在则相交,否在不相交。如果相交,两个链表的入口点可能不是环上同一结点,利用上边的方法分别找出各自的入口点,可以定义任意一个入口点为相交的第一个结点。

快慢指针的概念及其应用相关推荐

  1. Faster\Slower 快慢指针的应用

    leetcode很多题目都是利用快慢指针来解决题目,下面具体讲解下快慢指针. 概念: 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍.在循环中的指针移动通常为:fas ...

  2. 试编写一个将双向循环链表逆置的算法_图解:链表的快慢指针,解决 80% 的链表面试题!...

    一.前言 链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高.例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存 ...

  3. 双指针--快慢指针和对撞指针

    1.基础概念 两个指针有 n*n种组合,因此时间复杂度是 O(n^2) .而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 O(2n),也就是O(n).双指针可以分为两种类型,一 ...

  4. 快慢指针判断单向链表是否有环及找环入口

    前言 关于快慢指针找环入口的这个问题,之前巴特跟我聊到过,印象比较深,今晚看学长在做的面试题,里面就出现了这个小知识. 发现有些东西不经意间就会用到,于是便出现此文.以后要努力做到善于总结,乐于总结. ...

  5. LeetCode 例题精讲 | 05 双指针×链表问题:快慢指针

    点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自面向大象编程 本期例题: LeetCode 876 - Middle of the ...

  6. 一文学会链表快慢指针解题技巧

    前言 上文 我们详细地学习了链表的基本概念,优缺点,也带大家一步步由浅入深地学习了链表的翻转技巧,这一篇我们来看看链表的另一个解题技巧:快慢指针. 快慢指针在面试中出现的概率也很大,也是务必要掌握的一 ...

  7. reorder-list——链表、快慢指针、逆转链表、链表合并

    Given a singly linked list L: L0→L1→-→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→- You must do th ...

  8. 证明利用快慢指针寻找有环单链表中环的起点算法

    问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...

  9. c 链表之 快慢指针 查找循环节点(转)

    上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指 ...

最新文章

  1. 机器学习大神迈克尔 · 乔丹:我讨厌将机器学习称为AI
  2. android studio apt作用,解决Android studio 3.0 apt插件问题
  3. arthas 排查内存溢出_【spark-tips】spark2.4.0触发的executor内存溢出排查
  4. Spring Cloud Zuul网关(快速搭建)
  5. python 钉钉机器人发送图片_Python结合钉钉实时自动监控股票行情,上班炒股再也不怕老板发现...
  6. 服务器开放特定端口的方法
  7. isight参数优化理论与实例详解_案例1(ISIGHT集成ADAMS CAR方法实现)
  8. wincc服务器系统,什么情况下用wincc服务器与客户端
  9. Android文本框实现搜索和清空效果
  10. python连接mysql查询数据返回字典格式
  11. 重学C++语言之路:C++语言学习工具和环境
  12. Jenkins构建jmeter进行接口测试的一些配置
  13. 501.二叉搜索树中的众数
  14. 在db2中 两个数据库之间的两个表的联合查询
  15. HDU-1527-取石子游戏【威佐夫博弈】
  16. 计算机模拟做报童模型,用基于计算机随机模拟的下降法求解报童问题
  17. 小米为何要死磕某国产手机企业?这是多年被压迫下的反击
  18. 脚本中fi是什么意思
  19. 年底个人安全注意事项
  20. 在sweetalert弹出窗插件中加入html代码

热门文章

  1. 递归算法转换成非递归算法
  2. comsol学习中心:定义与材料选择
  3. C语言fscanf/fprintf函数(格式化读写文件)的用法(%[]和%n说明符)
  4. MPAndroidChart的详细使用——BarChart叠状条形图(四)
  5. 微信聊天记录同步电脑
  6. spring之Annotation
  7. 2018计算机系统结构全国卷,2018年10月高等教育自学考试全国统一命题考试02325计算机系统结构试卷及答案.doc...
  8. 【Delphi学习】Form的borderstyle属性
  9. linux-c之函数(函数指针、函数传参、命令行参数)
  10. win10进入不了系统修复方法