leedcode合并排序的数组

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

初始化 A 和 B 的元素数量分别为 m 和 n。

示例:

输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3

输出: [1,2,2,3,5,6]

来源:力扣

因为在写这个题目的时候,我本来想的是将两个数组用双指针的办法去排序,存放进一个新数组中,再重新给A数组赋值,但是在main方法中输出A数组,发现A数组的值并没有改变,所以我对java中函数的调用这个功能产生了困惑,特此记录一下,再写上解题思路。

这个要从函数的调用讲起,我这看了一篇博客,讲的十分详细:
函数的调用

我这里就用新写的demo来举例吧:

class test 中有要被调用的函数:test

public class test {
public void test(int[] a) {
	int[] b = new int[a.length];
	for(int i = 0; i < a.length; i++) {
		b[i] = 1;
	}
	a = new int[b.length];
	a = b;
}
}

在Damo中有个main,是执行的函数

public class Demo {
	public static void main(String[] args) {
		int[] a = new int[] { 1, 2, 3 };
		new test().test(a);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
	}
}

接着我用图讲解一下函数执行过程中内存的变化。

JVM自动寻找main函数,读取第一行代码,指针11111指向堆内存里面创建的一个对象:
在这里插入图片描述
然后读取第二行,是调用一个函数,将a作为传参值传入该函数中:

在这里插入图片描述
但是再执行test函数的时候,产生了一个新变量赋值,得到结果,再将传入的指向i的指针指向了那个新变量

在这里插入图片描述
函数调用结束,释放内存:

在这里插入图片描述
所以重新赋值的被传入参数并不能改变参数原有的指针指向,这就是为什么我第一个思路错误的原因。

所以只能对原A数组进行更改,才能在main函数调用后,A的数组会随之改变得到我们想要的值。

可以考虑从数组最后面开始互相比较,以此更改数组A。

public class Merge {
    public void merge(int[] A, int m, int[] B, int n) {
        while (m > 0 && n > 0) {
        	if(A[m - 1] > B[n - 1]) {
        		A[m + n - 1] = A[m - 1];
        		m--;
        	}
			else {
				A[m + n - 1] = B[n - 1];
				n--;
			}
        while (n > 0) {
				A[n - 1] = B[n - 1];
				n--;
			}
		}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值