合并联两个排序的列表&&合并两个有序数组

这篇博客介绍了如何使用递归和双指针策略分别解决合并两个有序链表和合并两个有序数组的问题。在链表合并中,通过比较头节点的值决定插入方向,保持O(1)的空间复杂度和O(n)的时间复杂度。而在数组合并中,双指针遍历数组,将较小值依次插入新数组,最后将结果存回原数组,同样保持了O(n)的时间复杂度。
摘要由CSDN通过智能技术生成

题目:合并联两个排序的列表

描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6}

解题思路:

采用的递归的思路,{1,3,5},{2,4,6}这个例子中,1和2对比,1比较小,所以是第二个链表会插入到第一个链表,需要返回第一个链表,但是在返回之前需要看3是不是比2大,才能确认插入的位置

代码

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list2==null)return list1;
        if(list1==null)return list2;
        if(list2.val > list1.val){
            list1.next = Merge(list1.next,list2);
            return list1;
        }
        else{
            list2.next = Merge(list1,list2.next);
            return list2;
        }
    }
}

合并两个有序的数组

描述
给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组

注意:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的

输入:
[4,5,6],[1,2,3]
返回值:
[1,2,3,4,5,6]

说明:
A数组为[4,5,6],B数组为[1,2,3],后台程序会预先将A扩容为[4,5,6,0,0,0],B还是为[1,2,3],m=3,n=3,传入到函数merge里面,然后请同学完成merge函数,将B的数据合并A里面,最后后台程序输出A数组

思路:采用双指针的思路,新建一个新的数组,然后A和B 中的值一一对比,其中比较小的值填入新数组中

代码:

public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int[] r = new int[m+n];
        int a=0;
        int b=0;
        while(a<m && b<n ){
            if(A[a]<=B[b]){
                r[a+b]=A[a];    //如果A的值小于等于B的值,则取A的值放入新数组中
                a++;
            }
            else{
                r[a+b]=B[b];    //如果A的值大于B的值,则取B的值放入新数组中
                b++;
            }
        }    //循环结束,说明A或B,有一个数组的值已经遍历完了
        
        if(a!=m){  //如果B 已经遍历完了
            for(int i=a;i!=m;i++){
                r[i+n]=A[i];
            }
        }
        if(b!=n){  //如果A已经遍历完了
            for(int i=b;i!=n;i++){
                r[i+m]=B[i];
            }
        }
         for(int i=0;i!=m+n;i++){    // 把新数组赋值给A,因为题目要求返回A
            A[i]=r[i];
        }        
    }
}

ps: 这里只是一种解法,还有从后面开始遍历的解法,或者更多,有空补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值