riglen
发布于 2026-04-20 / 0 阅读
0

快慢指针

1. 核心思想

定义两个指针:

  • slow:每次走 1 步
  • fast:每次走 2 步(有时根据题意调整)

通过两者的速度差,解决链表中的一些位置、环、相遇问题。


2. 适合哪些题目

(1)判断链表是否有环

典型题:

  • 141. 环形链表

思路:

  • 有环:快指针最终会追上慢指针
  • 无环:快指针会走到 null

(2)找环的入口

典型题:

  • 142. 环形链表 II

思路:

  • 先用快慢指针判断是否相遇
  • 相遇后再用一个新指针从头出发,和慢指针一起走
  • 再次相遇的位置就是环入口

(3)找链表中点

典型题:

  • 876. 链表的中间结点

思路:

  • fast 一次两步,slow 一次一步
  • fast 到终点时,slow 正好在中间

(4)找倒数第 k 个节点

这题更常见是“前后指针”,但本质也属于双指针思想。

思路:

  • 先让一个指针走 k
  • 然后两个指针一起走
  • 当前指针到尾部时,后面的指针就是倒数第 k

(5)判断链表是否为回文

典型题:

  • 234. 回文链表

思路:

  • 快慢指针先找中点
  • 反转后半部分
  • 两边一起比较

3. 常用模板

3.1 判断是否有环

ListNode slow = head;
ListNode fast = head;

while (fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    if (slow == fast) {
        return true;
    }
}
return false;