之前做题时也遇到过双指针解法,比如:
- 需要多层循环嵌套时,可以采用双指针法来减少复杂度。
- 得到链表倒数第n个元素时,可以使用快慢指针优化算法,只要快指针比慢指针快n就可以。
最近做了几道去除数组或链表中重复数字的题目,包括去掉所有重复数字,每个重复数字保留一个,每个重复数字保留两个等等。
LeetCode26: Remove Duplicates from Sorted Array
LeetCode27: Remove Element
LeetCode80: Remove Duplicates from Sorted Array II
LeetCode82: Remove Duplicates from Sorted List II
LeetCode83: Remove Duplicates from Sorted List
这些题目都可以使用双指针法解决。
使用两个指针 left 和 right,其中 left 是慢指针,而 right是快指针。只要 nums[left] = nums[right],就增加 right 以跳过重复项。
当nums[left]!=nums[right],就根据题目要求将后面的数复制到慢指针指向的中。
当题目不要求返回的数组中的数的顺序时,也可以使用头尾指针,如果数有重复时,直接将头指针与尾指针交换即可。例如:Remove Element
另外,当链表的头可能发生改变,而又要返回链表的头时,可以设置一个哑指针。例如: Remove Duplicates from Sorted List II 。如果原来的头被移除了,哑指针也可以指向新的头。所以返回时直接返回哑指针的下一个节点即可。