一、简介:什么是快慢指针?

快慢指针,顾名思义,无非就是设置一个快指针,一个慢指针,初始化的时候,快指针和慢指针都指向链表的头结点,前进的时候一个在前一个在后,结合起来可以十分巧妙的解决链表中的一些问题;

看完本文可以解决leetcode141题(简单)以及leetcode142题(中等)。
双指针算法之快慢指针(二):力扣【寻找链表的第N个点】leetcode-876、19

二、典例一:判断链表是否有环

这个应该属于链表算法的经典的操作了,如果一个单链表有环,一个指针是判断不出来的,因为链表尾部和头部"链接"在一起,形成了一个死循环。

boolean hasCycle(ListNode head) {while (head != NULL)head = head.next;return false;
}

如果使用一个指针:上述的代码,如果没有环的话,head 指针最后就会走到NULL,就会返回 false。到那时如果链表是有环的,就麻烦了,head会在循环中一直出不来的,自然不会有结果~
但是,如果设置快慢两个指针,快指针走到null的时候,就可以得知这个链表是没有环的;如果快慢指针相遇了,说明快指针肯定已经走了几圈了,这个链表肯定是有环的。
比较经典的就是leetcode的141题

1、题目描述:


2、思路以及代码

只要快慢指针相遇,说明是有环的,所以我们这里设置快指针 fast 一次走两步,慢指针 slow一次就一步;

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {public:bool hasCycle(ListNode *head) {ListNode *fast,*slow;fast = slow = head;  // 初始都头节点的位置while (fast != NULL && fast->next != NULL) {fast = fast->next->next;slow = slow->next;if (fast == slow) {  // 相遇了return true;}}return false;}
};

三、典例二:判断链表中是否有环,有环就返回环的起始位置

刚刚的快慢指针判断链表是不是有环其实还是很好理解的,但是进一步提升的话,判断出来有环之后,返回这个环的开始位置, 不仅仅需要判断是不是有环,有环的话还有知道环是where 开始的。

比较经典的就是leetcode的142题

1、题目描述

2、题目分析

在这里,我们先回到上一题的解法,使用快慢指针去判断是不是有环,如果快慢指针相遇了,就是有环,那么,快慢指针相遇在哪一个点呢?这个点有什么特别之处吗?除了相遇的点,我们还应该注意到链表头结点,相遇点,环开始结点。
其实142题的核心,确实就在于分析一下这3个点,下面我们就来分析一下:

下图的声明:
O 是链表头结点
A 是环开始的点
B 是快指针和满指针相遇的点
K 是慢指针 slow 在快慢指针相遇之时走的路程,即推:快指针是 2 K
L(OA)是 从O 开始 第一次遇到 A 走的路长,就是下图蓝色部分
L(AB)是 从A 开始 第一次遇到 B 走的路长,就是下图红色部分
L环 是 从A 开始 再一次遇到 A 走的路长 其实就是k了
L(BA)是 从B开始 第一次遇到 A 走的路长。就是下图绿色部分

根据下图的计算,我们可以知道 L(OA)和 L(BA) 的长度是一样的

由于 L(OA)和 L(BA) 的长度是一样的,所以我们在快指针 fast 和满指针 slow 相遇的时候,在B点相遇的时候,

1、快指针 fast 继续前进,速度和慢指针一样
2、慢指针 slow 返回链表头结点 O点,
3、快慢指针的速度保持一致,各自继续前进

那么,快慢指针下一次相遇的点是哪里?没错,就是 A 点,就是环开始的结点。

3、解题代码

由此,我们可以写出下面的伪代码:

ListNode detectCycle(ListNode head) {快慢指针初始化,都在头结点while (fast != null && fast.next != null) {快指针一次两步慢指针一次一步if (快指针 = 慢指针)  {//即相遇  此时在 B 点慢指针回到头结点;while (slow != fast) {快慢指针继续走,一次一步;}return slow;}}return NULL;
}

随后就可以写出全部的代码了:

class Solution {public:ListNode *detectCycle(ListNode *head) {ListNode *fast,*slow;fast = slow = head;while (fast != NULL && fast->next != NULL) {fast = fast->next->next;slow = slow->next;if (fast == slow) {slow = head;while (fast != slow) {fast = fast->next;    slow = slow->next;}return slow;}}return NULL;}
};

双指针算法之快慢指针(一):力扣【判断链表是否有环】leetcode-141、142相关推荐

  1. 算法练习——判断链表是否有环 leetcode.141 python

    题目描述: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中存在环 ,则返回 true . 否则,返回 false . 方法一:hash表 hashset是一种特殊的hashmap, ...

  2. 双指针算法之快慢指针(二):力扣【寻找链表的第N个点】leetcode-876、19

    双指针算法之快慢指针(二):力扣[寻找链表的第N个点]leetcode-876.19 看完本文,可以去解决力扣的 867 题和 19 题 以往参考:双指针算法之快慢指针(一):力扣[判断链表是否有环] ...

  3. (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和

    代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...

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

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

  5. 算法基础--快慢指针

    快慢指针 快慢指针就是用一快一慢两个指针来遍历数据对象并解决问题,常用于解决例如2倍速来求中间指针或判断循环链表.恒定n个差值或用于寻找倒数第n个指针等问题. 1.环形链表 快慢指针的经典应用场景就是 ...

  6. 力扣 删除链表的倒数第N个节点

    力扣 删除链表的倒数第N个节点 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = ...

  7. 使用快慢指针判断链表是否有环

    有时候在面试中可能会遇到叫我们判断链表中是否有环的问题,这个问题的解决方法也很多,这里我记录一下比较简单的使用快慢指针的方法: 使用快慢指针是指: 设置两个指针,一快一慢,快指的是每次移动两步,慢指针 ...

  8. 快慢指针判断链表是否有环

    链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环. 我有时候就犯嘀咕,它俩一定 ...

  9. 【刷算法】判断链表是否有环以及返回入环节点

    题目描述 判断一个单链表是否有环,有环则返回入环节点,否则返回null 1->2->3->4->5->6↑ ↓8<-7 复制代码 例如上面这个链表就有环,入环节点是 ...

最新文章

  1. wordpress 外部数据接口_WordPress Plugin API(插件接口)
  2. python turtle库有什么用_Python中turtle库的使用
  3. Apache无法启动解决 the requested operation has failed
  4. socket网络编程——套接字地址结构
  5. php 内置mail 包,配置php自带的mail功能
  6. 配置phoenix连接hbase_Phoenix视图映射
  7. 使用了BeanUtils的简单操作
  8. centos6下安装php7的memcached扩展
  9. Java输出表格格式_在Java的System.out中以表格式输出
  10. 雷蛇在天猫618大爆发,雷军第二天就找其创始人取经
  11. MNIST数据集下载
  12. SSD性能怎么测?看这一篇就够了!
  13. 成都市计算机会考,四川省高中信息技术会考资料及试题
  14. Python常见问题与解决方案
  15. [bowen干货-5分钟算法系列]简洁不废话的排序算法-直接选择排序
  16. 软件测试工程师绩效考核细则,软件测试工程师绩效考核方案
  17. 你还在打王者荣耀吗?用pygame写个游戏自己玩吧!
  18. 使用git中rebase遇到的坑二 could not apply xxxx
  19. enumerate的用法:
  20. Julia文件和文件夹相关基础函数01

热门文章

  1. 操作系统课设--系统调用
  2. 【Opencv实战】“一岁年龄一岁心,匆匆岁月不由人“这款年龄检测机等你来(附源码)
  3. 【django】配置URLconf
  4. django_rest_framework之GenericAPIView(三)
  5. 在Windows C程序中使用Unicode编码
  6. 软件调试学习笔记(七)—— 单步步入单步步过
  7. laravel + Vue 前后端分离 之 项目配置- 生产环境部署
  8. 10、游标(Cursor)的定义及使用
  9. 在Servlet中向客户端写Cookie信息
  10. 1116 c语言竞赛 (20 分)【难度: 一般 / 知识点: 模拟】