题目
给你两个按非递减顺序排列的整数数组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--]; } }