1.删除排序链表中的重复元素二
问题描述:
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例:
示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]
思路:用三个指针,prev指向虚拟头节点, cur指向头节点, next指向头节点后一位。当next为空时直接返回虚拟头节点及头节点,当cur.val != next.val时,让指针都向后移一位,当循环走完,next指向第一个不重复节点时,将cur指向该节点,再继续至走完为止。
代码:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyHead = new ListNode(101);
dummyHead.next = head;
ListNode prev = dummyHead;
ListNode cur = prev.next;
while (cur != null){
ListNode next = cur.next;
if (next == null){
return dummyHead.next;
}
if (cur.val != next.val){
prev = prev.next;
cur = cur.next;
}else {
while (next != null && cur.val == next.val){
next = next.next;
}
prev.next = next;
cur = next;
}
}
return dummyHead.next;
}
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)
2.移动零
问题描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例:
示例 1:
输入: nums =[0,1,0,3,12]输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]输出:[0]
思路:先遍历一遍将数值非零的元素移到数组前面,再将数组后面的元素补为零
代码:
class Solution {
public void moveZeroes(int[] nums) {
int len = nums.length;
int j = 0;
for(int i=0;i<len;i++){
if(nums[i]!=0){
nums[j++]=nums[i];
}
}
for(int i=j;i<len;i++){
nums[i]=0;
}
}
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)