解题思路:
输入已排序好的nums1和nums2数组,将nums2中的数据插入到nums1中。如果从小到大遍历(从数组下由小到大遍历),当nums2的数据插入到nums1时会覆盖nums1中原有位置的数据,从而丢失了此数据,此种做法不可行。
我们可以换种角度看问题。将标记位定位到nums1和nums2中数字的末位。将从大数开始比较,若nums1[m-1]比nums2[n-1]小,则将nums2[n-1]插入到nums1[n+m-1](nums1数组的最后位置),否则将nums1[n-1]插入到nums1[n+m-1](nums1数组的最后位置),依次往前遍历。当nums1或nums2中的数据遍历完了,则跳出循环。如果某个数组中还有多于的数字没有插入,则将剩余数字覆盖nums1中前面部分的数字。最后打败了99.48%,可能是因为跳出循环后,nums2中的数字全部插入,nums1中还有部分没有插入,则不需要做覆盖操作。
源码附上:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int temp1=m-1,temp2=n-1,temp=m+n-1;
while(temp1>=0&&temp2>=0)
{
if(nums1[temp1]<nums2[temp2])
nums1[temp--]=nums2[temp2--];
else
nums1[temp--]=nums1[temp1--];
}
while(temp1>=0)
{
nums1[temp--]=nums1[temp1--];
}
while(temp2>=0)
{
nums1[temp--]=nums2[temp2--];
}
}
};