合并两个有序数组(JAVA)
题外话
在我个人的思路视角里,遇到这种排序问题总是会在脑子里产生一些画面感。让我将这些问题奔着一种奇妙的思路而去,也就是在我脑子里很简答,但难以在代码上复现,我觉得从本我的角度讲我也许天生不适合当一个高级程序员hhhh,但!我命由我不由天!
题解
题目
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
审题
题目中说的是两个小数组都是有序数组,这意味着我们不用再担心插入过程中需要过多复杂的程序来选择两个数组剩余的元素里谁是最大的。很自然的可以想到,只要设置两个指针,分别从两个数组的最后往前寻找,两边谁大就在数组1的后面插入(因为数组1已经设置为了m+n)。
需要知识 for循环,if判断结构
是的,我们只需要掌握for和if就可以将这道题解出来了。
题解
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int index1 = m-1; //nums1数组的移动指针
int index2 = n-1; //nums2数组的移动指针
for (int i=m+n-1;i>=0;i--){
if(index1>=0 && index2>=0){
if(nums1[index1] > nums2[index2]){
nums1[i] = nums1[index1];
index1--;
}else{
nums1[i] = nums2[index2];
index2--;
}
}else if(index2>=0){
nums1[i] = nums2[index2];
index2--;
}else{
break;
}
}
}
}