- Posted by 微博@Yangsc_o
- 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本题是leetcode,地址:88. 合并两个有序数组
题目
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 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]
public void merge(int[] nums1, int m, int[] nums2, int n) {
}
分析
简单思路:nums1是参与排序的,同时也是排序的结果,这个有点不太好处理;如何解决呢?
我们很容易想到,把nums1 copy一份,然后对copy的操作,nums1的值直接覆盖,用双指针,使用了哪个指针的值,就让指针++;while终止条件就是++后的指针小于数组长度;如果一方已经遍历完毕,后续的数据就可以直接copy了;
code
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums1_copy = new int[m];
System.arraycopy(nums1,0,nums1_copy,0,m);
int first = 0, second = 0;
while(first < m && second < n) {
int v1 = nums1_copy[first];
int v2 = nums2[second];
if(v1 < v2) {
nums1[first + second] = v1;
first ++;
} else {
nums1[first + second] = v2;
second ++;
}
}
if(first < m) {
System.arraycopy(nums1_copy, first, nums1, first + second,m - first);
}
if(second < n) {
System.arraycopy(nums2, second, nums1, first + second,n - second);
}
}