21、合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目给出的ListNode的属性
/**
* 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 mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head=new ListNode();//定义头结点,头结点没有任何内容
ListNode temp=head;//辅助结点
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
while(list1!=null&list2!=null){
if(list1.val<=list2.val){
//将值小的节点排在前面,并且后移 list1 或 list2 指针
temp.next=list1;
list1=list1.next;
temp=temp.next;//后移,让下一个链表的结点存储在这个位置
}else{
temp.next=list2;
list2=list2.next;
temp=temp.next;
}
}
temp.next=(list1==null)?list2:list1;//最后链上还有剩余节点的链表
return head.next;
}
}
26、 删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
class Solution {
public int removeDuplicates(int[] nums) {
if(nums.length==0){
return 0;
}
//数组第一个数一定满足条件,故从第二个数开始比较,即设置索引=1开始。
//i是用来循环查询的,index是临时变量
int i = 1, index = 1;
//循环,通过比较,如果是重复的数,则后移一个索引找到一个不重复的数覆盖重复的数,并后移两个索引
//如果不重复,则直接后移两个索引
while (i < nums.length) {
if(nums[i]==nums[i-1]){
i++;
}else if(nums[i]!=nums[i-1]){
nums[index]=nums[i];
index++;
i++;
}
}
return index;
}
}
/**
*
第一时间想到的是利用set来完成,但是题目详细要求貌似不行
import java.util.HashSet;
import java.util.Set;
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i< arr.length;i++){
set.add(arr[i]);
}
System.out.print(set.size()+", ");
System.out.println("nums = "+set);
*/
27、移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//思路与26一样,都需要两个变量(指针)进行操作
public int removeElement(int[] nums, int val) {
int i = 0, j = 0;
while (i < nums.length) {
if (nums[i] == val) {
i++;
} else if (nums[i] != val) {
nums[j] = nums[i];
j++;
i++;
}
}
return j;
}
/**若使用for循环,注意i++**/
public int removeElement(int[] nums, int val) {
int i=0,j=0;
for(i=0;i<nums.length; ){ //这里for的i++和if-else if的i++二选一 (刚做的时候傻了,习惯性写了i++...)
if(nums[i]==val){
i++;
}else if(nums[i]!=val){
nums[j]=nums[i];
j++;
i++;
}
}
return j;
}