给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
1.思路:函数merge中的形参分别为第一个数组,第一个数组的实际数据长度,第二个数组,第二个数组的长度;新建一个数组,使用两个变量指向两个的第一个元素,如果第一个下标超出了数组1中的实际长度,只能选取第二个数组中的元素,如果两个数组下标都未超出,就进行下标对应的元素进行比较,小的放进数组,并且执行++操作,并且新建的数组值赋给第一个数组即可.
//从前往后
void merge(int* nums1, int m, int* nums2, int n) {
int indexNums1=0,indexNums2=0;
int *nums = (int *)malloc(sizeof(int) * m);
for(int i=0;i<m+n;i++)
{
if(indexNums1 >= m)
nums[i] = nums2[indexNums2++];
else if(indexNums2 >= n)
nums[i] = nums1[indexNums1++];
else if(nums1[indexNums1] >= nums2[indexNums2])
nums[i] = nums2[indexNums2++];
else
nums[i] = nums1[indexNums1++];
}
for(int i=0;i<m+n;i++)
{
nums1[i] = nums[i];
}
free(nums);
}
缺点:新建开辟一个数组空间,较浪费内存.
2.改进:从数组1知道,数组的总长度是大于等于m+n的,这也就是意味着nums[m]之后的都是没存放数据,可以可以倒着保存,这样就不用开辟数组了。
void merge(int* nums1, int m, int* nums2, int n) {
int lastNums1=m-1,lastNums2=n-1;
for(int i=m+n-1;i>=0;i--)
{
if(lastNums1 < 0)
nums1[i] = nums2[lastNums2--];
else if(lastNums2 < 0)
nums1[i] = nums1[lastNums1--];
else if(nums1[lastNums1] >= nums2[lastNums2])
nums1[i] = nums1[lastNums1--];
else
nums1[i] = nums2[lastNums2--];
}
}