一、题目
1、审题
2、分析
给出有序整数数组 nums1、nums2,将 nums2 中元素放入 nums1 中,且使得nums1仍然有序,假使 nums1 空间足够大。
二、解答
1、思路:
方法一、
将 nums1 与 nums2 依次进行比较,将小的数放在 nums1 从下标为 0 开始的位置,大的数值放入 nums2 并在nums2中进行排序。
最终 nums2 中的 n 个数均比 nums1 中的 m 个数大,在将 nums2 数放入 nums1 即可。
public void merge(int[] nums1, int m, int[] nums2, int n) { if(n == 0) return; if(m == 0) { for (int i = 0; i < n; i++) { nums1[i] = nums2[i]; } } int i = 0; while(i < m) { if(nums1[i] > nums2[0]){ int tmp = nums1[i]; nums1[i] = nums2[0]; int k = 1; if(n == 1 || tmp <= nums2[k]) nums2[0] = tmp; else { while(k < n && tmp > nums2[k]){ nums2[k-1] = nums2[k++]; } nums2[k-1] = tmp; } } i++; } i = 0; while(i < n) nums1[m++] = nums2[i++]; }
方法二、
将 nums1 与 nums2 均从数组末尾开始比较,将大的数放在nums1从 m+n-1 的位置并依次向前。
public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m-1, j = n-1; while(i >= 0 && j >= 0) { if(nums1[i] >= nums2[j]){ nums1[i+j+1] = nums1[i]; i--; } else { nums1[i+j+1] = nums2[j]; j--; } } while(j >= 0) nums1[j] = nums2[j--]; }