【代码随想录】双指针法
数组
移除元素
移除元素
在数组中原地移除元素,使用双指针,一个指向遍历的位置,一个指向删除后数组的长度
字符串
反转字符串
反转字符串
两个指针分别从头和尾向中间遍历,相互交换字符
替换数字
替换数字
类似于移除元素,两个指针分别代表替换后字符串的真实位置和遍历的位置。注意是从后往前填充。
翻转字符串里的单词
翻转字符串里的单词
首先删除多余的空格(双指针法),然后:
- 使用双指针法确定每一个单词,并进行反转 or
- 将整个字符串反转,然后再将每个单词反转回来
链表
反转链表
反转链表
两个指针一前一后,交换节点 next 的指向。
删除链表的倒数第N个节点
删除链表的倒数第N个节点
快指针先走 N 步,然后和慢指针一起走,快指针走到末尾,慢指针就指向倒数第 N 个节点。
链表相交
链表相交
同样是快慢指针,先让快指针在长的链表上走两个链表的差值(目的是让两个链表尾端对齐),然后慢指针在短链表上和快指针一起走,直到找到相交点。
环形链表II
环形链表II
快指针一次走两格,慢指针一次走一个,判断是否有环;如果有环,则让两个新指针分别从相遇点和起点出发,两个新指针相遇的点即为环的起点。
N 数之和
三数之和
三数之和
首先将数组进行排序,循环确定第一个数,然后两个指针分别确定后两个数,两个指针分别为剩下数组中最大和最小的数,然后两个指针分别靠近彼此。
四数之和
四数之和
和三数之和类似,只不过多加了一层循环。
总结
除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为 O(n) 。