力扣88合并两个有序数组

题目

给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。

请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为 n 。
链接:https://leetcode.cn/problems/merge-sorted-array

题解

如果从前往后比较,会出现一些元素被覆盖的情况。所以从后往前比较,先把较大的元素放在nums1尾部,这样就不会出现元素被覆盖的情况了。分别设置3个指针end1、end2、tmp,end1指向nums1中最后一个非0元素,end2指向nums2中最后一个元素,tmp指向nums1中最后一个元素。当nums1和nums2都不为空时,比较nums1[end1]和nums2[end2],如果nums1[end1]>nums2[end2],nums1[tmp]=nums1[end1],tmp--,end1--;如果nums1[end1]<nums2[end2],nums1[tmp]=nums2[end2],tmp--,end2--。如果end2比end1先为0,则剩下不用比较,程序直接结束;如果end1比end2先为0,则需要把nums2中剩余的元素一次拷贝到nums1中。

分析如下:

代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
	int end1 = m - 1;
	int end2 = n - 1;
	int tmp = m + n - 1;
	while (end1 >= 0 && end2 >= 0)
	{
		if (nums1[end1] < nums2[end2])
		{
			nums1[tmp--] = nums2[end2--];
		}
		else
		{
			nums1[tmp--] = nums1[end1--];
		}
	}
	while (end2 >= 0)
	{
		nums1[tmp--] = nums2[end2--];
	}
}

猜你喜欢

转载自blog.csdn.net/minLi_/article/details/131602237