剑指Offer_4Extra_合并两个有序数组

题目描述

有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请事先一个函数,把A2中的所有数字插入到A1zhong并且所有的数字是排序的。

解题思路

和前面的例题一样,很多人首先想到的办法是在A1中从头到尾复制数字,但是这样会出现多次复制一个数字的情况。
更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。
注意边界条件的控制,如果A1已经移动结束,但是A2还没有结束,需要将A2移动到A1的其实位置而A1的指针不动

代码实现

public class MergeSortedArray
{

    public static int[] merge(int[] a, int[] b)
    {
        if (a == null)
            return b;
        if (b == null)
            return a;

        int p1 = a.length - 1 - b.length;
        int p2 = b.length - 1;
        while (p2 >= 0)
        {
            if (p1 >= 0 && a[p1] > b[p2])
            {
                a[p1 + p2 + 1] = a[p1];
                p1--;
            } else
            {
                a[p1 + p2 + 1] = b[p2];
                p2--;
            }
        }

        return a;
    }

    public static void main(String[] args)
    {
        //int[] a = {1, 5, 7, 9, 15, 0, 0, 0};
        //int[] a = {9, 15, 0, 0, 0};
        //int[] a = {1,9, 15, 0, 0, 0, 0,0};
        int[] a = {1,3,5,7,8,9,11,12,13,14,15,0,0,0,0,0};

        int[] b = {2, 4, 6, 10,16};
        merge(a, b);
        for (int i : a)
        {
            System.out.print(i + " ");
        }
        System.out.println("");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值