题目地址:https://leetcode.com/problems/merge-sorted-array/
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
这个题目与合并有序链表的思路一样,都是比较元素值的大小,然后插入到新的数组中。
如果直接在元数组中插入也行(题目已经告诉我们了空间管够),但是数组插入后需要移动后面的元素,这个操作比较耗时,所以尽量避免这种操作。
public class MergeSortedArray {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int[] r = new int[m + n];
int k = 0;
int i = 0, j = 0;
// 将值小的插入到前面
for (; i < m && j < n;) {
if (nums1[i] < nums2[j]) {
r[k++] = nums1[i];
i++;
} else if (nums1[i] == nums2[j]) {
r[k++] = nums1[i];
r[k++] = nums2[j];
i++;
j++;
} else {
r[k++] = nums2[j];
j++;
}
}
// 处理剩下的元素
if (i < m) {
for (int p = 0; p < m - i; p++) {
r[n + p + i] = nums1[i + p];
}
}
if (j < n) {
for (int p = 0; p < n - j; p++) {
r[m + j + p] = nums2[j + p];
}
}
// 复制数组,耗时O(n)
System.arraycopy(r, 0, nums1, 0, m + n);
}
public static void main(String[] args) {
/*int[] num1 = {1,4,5,6,9,13,0,0,0,0,0,0,0,0,0,0,0};
int[] num2 = {1,2,3,4,5,9,12,14,14,18,30};*/
int[] num1 = {};
int[] num2 = {};
merge(num1, 0, num2, 0);
for (int n : num1)
System.out.print(n + " ");
}
}
时间复杂度为O(m+n),其中m,n是两个数组的大小,附加空间大小也为O(m+n)。