一、移动零
1、题目
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
2、思路
创建两个指针 i 和 j,第一次遍历的时候每遇到一个非0元素就将其往左边挪,并且用指针 j 用来记录当前非0元素个数,第一次遍历完后,j 指针的下标就指向了最后一个非0元素下标,第二次遍历的时候,起始位置就从 j开始到结束,将剩下的元素全部置为 0。
3、代码
class Solution {
public void moveZeroes(int[] nums) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++;
}
}
for(int i=j;i<nums.length;i++){
nums[i]=0;
}
}
}
4、复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
二、删除排序链表中的重复元素Ⅱ
1、题目
给定一个已排序的链表的头
head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]
2、思路
利用多次循环判断,每次可删除一个或者两个,若下个节点与之前删除的值相同则删除,若后两个节点值相同则都删除,否则指针后移一位继续判断。
3、代码
/**
* 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 preHead = new ListNode(Integer.MAX_VALUE, head);
int deleteVal = preHead.val;
ListNode cur = preHead;
while(cur.next != null && cur.next.next != null){
if(cur.next.val == deleteVal){
cur.next = cur.next.next;
}else if(cur.next.val == cur.next.next.val){
deleteVal = cur.next.val;
cur.next = cur.next.next.next;
}else{
cur = cur.next;
}
}
if(cur.next != null && cur.next.val == deleteVal){
cur.next = null;
}
return preHead.next;
}
}
4、复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)