【leetocde】(有序数组/链表中去重:快慢指针)26. 删除有序数组中的重复项 83. 删除排序链表中的重复元素、27. 移除元素、283. 移动零
有序数组/链表中去重
题目:26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)
数组问题中比较常见且难度不高的的快慢指针技巧,是让你原地修改数组。
思路:
题干说在原地修改输入数组 ,可以考虑遍历数组,遍历重复项不做改变,遍历到不重复项对其移动到之前的重复项;
对于该有序数组,可以使用快慢指针的技巧,让slow和fast指针同时指向头节点,fast走在前面,
如果发现一个不重复的元素就告诉slow,让slow前进一步,平且交换元素
如果发现重复元素,slow不变
fast继续前进
代码如下:
class Solution { public int removeDuplicates(int[] nums) { int n = nums.length; if(n==0){ return 0; } int slow = 0,fast = 0; while(fast<n){ if(nums[fast] != nums[slow]) { slow++; nums[slow] = nums[fast]; } fast++; } return slow+1; } }
同理在
题目:83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)
代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode deleteDuplicates(ListNode head) { if(head == null || head.next == null) return head; ListNode slow = head; ListNode fast = head.next; while(fast != null){ if(fast.val != slow.val){ slow = slow.next; slow.val = fast.val; } fast = fast.next; } slow.next = null; return head; } }
题目:27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)
代码:
如果 fast
遇到值为 val
的元素,则直接跳过,否则就赋值给 slow
指针,并让 slow
前进一步。
class Solution { public int removeElement(int[] nums, int val) { int n = nums.length; if(n==0){ return 0; } int slow = 0,fast = 0; while(fast<n){ if(nums[fast] != val) { nums[slow] = nums[fast]; slow++; } fast++; } return slow; } }
注意这里和有序数组去重的解法有一个细节差异,我们这里是先给 nums[slow]
赋值然后再给 slow++
,这样可以保证 nums[0..slow-1]
是不包含值为 val
的元素的,最后的结果数组长度就是 slow
。
题目:283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)
思路:与上题类似,相当于去掉所有的元素0,然后再其余数组位置元素赋值为0
代码:
class Solution { public void moveZeroes(int[] nums) { int fast = 0,slow =0; while(fast<nums.length){ if(nums[fast] != 0){ nums[slow] = nums[fast]; slow++; } fast++; } while(slow<nums.length){ nums[slow] = 0; slow++; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了