88. 合并两个有序数组
给你两个 有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 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]
思路
开辟一个足够大小为为两数组中最大大长度的数组,用来存放排序后的数组元素。定义两个指针,分别指向数组首元素。再定义一个指针指向新数组。
ptr1和ptr2指向元素互相比较,ptr1小于ptr2指向元素,ptr1指向元素就放入新数组。 ptr1向后移动。
再让ptr1移动后再和ptr2指向元素继续比较,相同的话,放哪个都可以。
当ptr1和ptr2其中一个到达末尾,就停止比较。
此时,如果另外一个指针还未到达末尾,说明还有元素没有拷贝到新数组。因为另一个已经到达末尾,说明另一个数组剩下的元素都比已经完成拷贝数组中元素大。直接将剩下的元素拷贝到新数组。 完成排序。
最后,利用memcpy函数,把新数组内容拷贝到目的地。 完成排序。
代码示例
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int* tmp = malloc(sizeof(int) * (m + n)); //开辟一个足够存放排序完毕数组大小
int i1 = 0, i2 = 0;
int i = 0;
while (i1 < m && i2 < n) //有一个数组拷贝完毕,就停止拷贝。
{
if (nums1[i1] < nums2[i2]) //小的先放入数组。
{
tmp[i] = nums1[i1];
i1++;
i++;
}
else //大的和相同的后放入。
{
tmp[i] = nums2[i2];
i2++;
i++;
}
}
//如果nums2放完了,nums1还没放完,说明nums1剩下的都是比nums2数组中大的。
//直接放入数组
while (i1 < m)
{
tmp[i] = nums1[i1];
i++;
i1++;
}
//同理
while (i2 < n)
{
tmp[i] = nums2[i2];
i++;
i2++;
}
//使用memcpy函数,把排序完毕后数组拷贝目标数组。
memcpy(nums1, tmp, sizeof(int) * (m + n));
free(tmp);
}