力扣Day1

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;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值