25、合并两个有序链表、合并两个数组

本文介绍如何使用Java实现合并两个有序链表和数组,同时保持合并后的元素有序,并提供两种方法,一种是递归双指针,另一种是数组复制排序。通过实例演示和代码优化,探讨了提高代码效率和通用性的技巧。

1、合并两个有序链表

package com.yuan;

import java.util.ArrayList;
import java.util.List;

/**
 * @author QLBF 合并两个有序链表  并保持单调性
 * @version 1.0
 * @date 2021/5/29 16:20
 */
class ListNode6{
    int val;
    ListNode6 next;

    public ListNode6(int val) {
        this.val = val;
    }
}
public class demo6 {
    //遍历
    public static List printList(ListNode6 head){
        if (head==null){
            return null;
        }
        ArrayList<Integer> arrayList=new ArrayList();
        while (head!=null){
            arrayList.add(head.val);
            head=head.next;
        }
        return arrayList;
    }

    //合并
    public static ListNode6 merge(ListNode6 list1,ListNode6 list2){
        if (list1==null){
            return list2;
        }
        if (list2==null){
            return list1;
        }

        if (list1.val<list2.val){
            list1.next=merge(list1.next,list2);
            return list1;
        }else {
            list2.next=merge(list1,list2.next);
            return list2;
        }
    }

    public static void main(String[] args) {
        ListNode6 n1=new ListNode6(1);
        ListNode6 n3=new ListNode6(3);
        ListNode6 n5=new ListNode6(5);
        n1.next=n3;
        n3.next=n5;
        n5.next=null;
        
        ListNode6 n2=new ListNode6(2);
        ListNode6 n4=new ListNode6(4);
        n2.next=n4;
        n4.next=null;

        List list1 = printList(n1);
        List list2 = printList(n2);
        System.out.println("list1:"+list1);
        System.out.println("list2:"+list2);

        ListNode6 mergelist = merge(n1, n2);
        System.out.println("合并后:"+printList(mergelist));

    }
}

在这里插入图片描述
参考:https://blog.youkuaiyun.com/weixin_45625687/article/details/107940853

2、合并两个数组

在这里插入图片描述

public static void main(String[] args) {
        int[] num1=new int[]{2,3,16,5,7,0,0,0,0};
        int[] num2=new int[]{9,1,4,2};
        int[] merge = merge(num1, 5, num2, num2.length);
        System.out.println(Arrays.toString(merge));
    }

    private static int[] merge(int[] num1, int length1, int[] num2, int length2) {
        //把num2复制到num1里去,num2从0开始到length2,num1是要从length1后开始的
        System.arraycopy(num2,0,num1,length1,length2);
        Arrays.sort(num1);
        return num1;
    }

这代码通用性太低,还是考虑用双指针那些吧
参考:https://blog.youkuaiyun.com/weixin_44591656/article/details/113737615

private static int[] mergeIndexArray(int[] arr1,int m,int[] arr2,int n){
       int arr1_p=m;
       int arr2_p=n;
       int k=m+n+1;
       while (n>=0){
           if (arr1[m]>=arr2[n]){
               arr1[k]=arr1[m];
               m--;
               k--;
           }else {
               arr1[k]=arr2[n];
               n--;
               k--;
           }
       }
        return arr1;
    }
		//test代码
		int[] arr1=new int[]{-1, 1, 4, 0, 0, 0};
        int[] arr2=new int[]{2, 5, 6};
        int[] ints = mergeIndexArray(arr1, 2,arr2 , arr2.length-1);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值