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.

描述

给出两个有序的整型数组,要求将这两个数组合并到 nums1

分析

采用归并排序的思想,进行合并。因为数组的大小已知,采用从后往前进行合并,可以不需要额外的空间

代码

需要额外空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {

int[] newArray = new int[m + n];
int i, j, k;
i = j = k = 0;

while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
newArray[k++] = nums1[i++];
} else {
newArray[k++] = nums2[j++];
}
}

while (i < m) {
newArray[k++] = nums1[i++];
}

while (j < n) {
newArray[k++] = nums2[j++];
}

for (i = 0; i < n + m; i++) {
nums1[i] = newArray[i];
}
}
}

不需要额外空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {

int len = m + n - 1;
m--;
n--;

while (m >= 0 && n >= 0) {
if (nums1[m] > nums2[n]) {
nums1[len--] = nums1[m--];
} else {
nums1[len--] = nums2[n--];
}
}

// 因为是合并到 nums1
// 所以在 m >= 0 的情况下,此时数组已经完成合并,不需要操作
// 因此只需处理 n >= 0 的情况
for (int i = 0; i <= n; i++) {
nums1[i] = nums2[i];
}
}
}