【代码随想录】双指针法
wbfwonderful Lv4

数组

移除元素

移除元素

在数组中原地移除元素,使用双指针,一个指向遍历的位置,一个指向删除后数组的长度

字符串

反转字符串

反转字符串

两个指针分别从头和尾向中间遍历,相互交换字符

替换数字

替换数字

类似于移除元素,两个指针分别代表替换后字符串的真实位置和遍历的位置。注意是从后往前填充。

翻转字符串里的单词

翻转字符串里的单词

首先删除多余的空格(双指针法),然后:

  • 使用双指针法确定每一个单词,并进行反转 or
  • 将整个字符串反转,然后再将每个单词反转回来

链表

反转链表

反转链表

两个指针一前一后,交换节点 next 的指向。

删除链表的倒数第N个节点

删除链表的倒数第N个节点

快指针先走 N 步,然后和慢指针一起走,快指针走到末尾,慢指针就指向倒数第 N 个节点。

链表相交

链表相交

同样是快慢指针,先让快指针在长的链表上走两个链表的差值(目的是让两个链表尾端对齐),然后慢指针在短链表上和快指针一起走,直到找到相交点。

环形链表II

环形链表II

快指针一次走两格,慢指针一次走一个,判断是否有环;如果有环,则让两个新指针分别从相遇点和起点出发,两个新指针相遇的点即为环的起点。

N 数之和

三数之和

三数之和

首先将数组进行排序,循环确定第一个数,然后两个指针分别确定后两个数,两个指针分别为剩下数组中最大和最小的数,然后两个指针分别靠近彼此。

四数之和

四数之和

和三数之和类似,只不过多加了一层循环。

总结

除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为 O(n) 。