题目描述
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
思路
思路一
先合并两个数组,然后再利用sort算法进行排序。
思路二
拷贝数组nums1,比较nums1的拷贝与nums2中元素的大小,元素较小的放入nums1中。当某个数组的元素已经放完而另一个数组的元素没有放完时,将剩余元素全部添加进nums1中。
思路三
跟思路二类似,但是没有创建数组nums1的拷贝,比较nums1与nums2数组中元素的大小,较大者放入nums1的末尾(题目已假设nums1足以放入nums2的所有元素)。当nums2的元素率先全部放入时,nums1数组前面的元素都为原来的元素,当nums1的元素率先全部放入时,nums2的剩余元素替换nums1数组前面的元素。
代码
代码一
import java.util.Arrays;
public class Merging {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
代码二
public class Merging2 {
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 p1 = 0;
int p2 = 0;
int p = 0;
while(p1 < m && p2 < n)
{
if(nums1_copy[p1] <= nums2[p2])
nums1[p++] = nums1_copy[p1++];
else
nums1[p++] = nums2[p2++];
}
if(p1 == m)
{
System.arraycopy(nums2, p2, nums1, p, n - p2);
}
else if(p2 == n)
{
System.arraycopy(nums1_copy, p1, nums1, p, m - p1);
}
}
}
代码三
public class Merging3 {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1;
int j = n - 1;
int k = i + j + 1;
while(i >= 0 && j >= 0)
{
if(nums1[i] > nums2[j])
nums1[k--] = nums1[i--];
else
nums1[k--] = nums2[j--];
}
while(j >= 0)
nums1[k--] = nums2[j--];
}
}