题目:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
思路:可利用到归并排序的思想,归并排序的思想是有数组arr1,arr2,准备一个额外的数组help,用指针p1指向数组arr1的第一个元素,p2,指向数组arr2的第一个元素,同时使用一个p指针指向辅助数组,然后比较p1和p2的值谁小,谁小就方法辅助数组里面,p1,p2,p指针都往下移动一个位置,直到数组arr1,arr2中的数组被遍历完。
但是此题不适合从头开始遍历,会出现将原来排好序的数字覆盖,因此我们可以从尾部开始遍历
准备指针p1指向数组nums1的最后一个位置,p2指向数组nums2的最后一个位置,指针p指向二个数组合并之后的最后一个位置,
然后比较p1指向的值和p2指向的值谁大就放入p所在的位置,同时p1,p2,p的指针都往前移动,
注意,由于是以第一个数组nums1为最后合并的数组,可能导致nums1遍历完之后,nums2还未遍历完,最后需将nums2的元素添加到合并后的数组nums1中。
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1=m-1;
int p2=n-1;
int p=m+n-1;
while(p1>=0&&p2>=0){
if(nums1[p1]>=nums2[p2]){
nums1[p--]=nums1[p1--];
}else{
nums1[p--]=nums2[p2--];
}
}
while(p2>=0){
nums1[p--]=nums2[p2--];
}
}
注意:关于nums1中的元素和nums2中的元素相等的情况下,添加nums1的和nums2的元素都是一样。