题目描述:给你两个有序数组nums1和nums2,请你将nums2合并到nums1中,使得nums1成为一个有序数组。
说明:初始化nums1和nums2de元素数量分别为m和n。你可以假设nums1有足够的空间(大于等于m+n)来保存nums2中的元素。
eg: nums1={1,2,3,0,0,0} m=3
nums2={2,5,6} n=3
合并后:nums1={1,2,2,3,5,6}
解题思路:从后往前的双指针
取指针p1指向nums1的末尾元素,p2指向nums2的末尾元组,在每一步将最大的值添加到在数组nums1的末尾,p用来追踪添加元素的位置,最后将nums2中剩余的元素粘贴到nums1的前面。
题目难点:
①:数组的排序、删除问题一般要想到双指针,要想到用一个指针指向 题目要求的数组。
②:从后往前进行排序时,不需要额外的空间。
③:若nums2中有剩余元素,需将剩余元素粘贴到nums1中。
void merge(int* nums1, int nums1Size,int m, int* nums2, int nums2Size, int n) {
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
while (p1 >= 0 && p2 >= 0)
{//compare two elements from nums1 and nums2
//and add the larger to nums1
Nums1[p--]=(num1[p1]>nums2[p2])?
Nums[p1--]:nums[p2--];
}
while (p2 >= 0)
nums1[p--] = nums2[p2--];//将nums2中剩余元素粘贴到nums1的前面
文末小彩蛋
这里是小巨鹿的的代码小天地(●’◡’●),希望看到我小小笔记的同学一起加油哦~