LeetCode--88. 合并两个有序数组 C实现

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);
}


猜你喜欢

转载自blog.csdn.net/juggte/article/details/115332853