问题:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
题目来自leetCode
88.合并两个有序数组
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
首先说一下思路,假设:
nums1={1,2,4};
nums2 = {3,5};
m=3;
n=2;
由题目描述可知nums1 的空间为 3+2=5,解决这个问题我们可以从尾部反向插入元素。
从有元素的尾部开始比较,nums1[2]=4,nums2[1]=5,于是将5插入到nums1尾部(即P指向的位置),然后P指向上一个位置,同时nums2往前推进元素
按照上面的步骤进行进行,直到num1或者nums2走完。
走完要在判断nums2是否走完,如果没走完,则逐个继续插入nums1的头部。
代码:
public void merge(int[] nums1, int m, int[] nums2, int n) {
if(n==0){
return ;
}
//计算总长度
int l = m--+n---1;
while(m>=0&&n>=0){
nums1[l--] = nums1[m]>nums2[n]?nums1[m--]:nums2[n--];
}
while(n>=0){
nums1[l--] = nums2[n--];
}
}