1. 个人思路,从i=m处开始添加nums2元素,添加到m+n停止,再对数组进行排序:时间复杂度较高,未使用两个数组已经排序的特点
python代码:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
for i in range(m, m+n):
nums1[i] = nums2[i-m]
nums1.sort()
java代码:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for(int i=m;i<m+n;i++){
nums1[i] = nums2[i-m];
}
Arrays.sort(nums1);
}
}
C:
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
for(int i=m; i<m+n; i++){
nums1[i]=nums2[i-m];
}
qsort(nums1, m+n, sizeof(int), cmp);
}
2. 双指针
思路:两个数组各一个指针,每次取出较小的放入队列,需要额外的数组空间
python
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
i=0
j=0
sorted=[]
while i < m or j < n :
if i == m:
sorted.append(nums2[j])
j += 1
elif j == n:
sorted.append(nums1[i])
i += 1
elif nums1[i]<=nums2[j]:
sorted.append(nums1[i])
i += 1
else:
sorted.append(nums2[j])
j += 1
nums1[:] = sorted
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] sorted = new int[m+n];
int i=0,j=0;
while(i<m || j<n){
if(i == m){
sorted[j+i]=nums2[j];
j++;
}
else if(j == n){
sorted[i+j]=nums1[i];
i++;
}
else if(nums1[i]<nums2[j]){
sorted[i+j]=nums1[i];
i++;
}
else{
sorted[j+i]=nums2[j];
j++;
}
}
for(int k=0;k<m+n;k++){
nums1[k]=sorted[k];
}
}
}
C:
int cmp(const void *a, const void *b){
return *(int*)a - *(int*)b;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int p1 = 0, p2 = 0;
int sorted[m + n];
int cur;
while (p1 < m || p2 < n) {
if (p1 == m) {
cur = nums2[p2++];
} else if (p2 == n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (int i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
3. 逆序双指针
nums1后面是空的,因此可以从后往前塞,从大到小塞,无需额外空间,时间复杂度O(m+n)
python
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1, p2 = m - 1, n - 1
tail = m + n - 1
while p1 >= 0 or p2 >= 0:
if p1 == -1:
nums1[tail] = nums2[p2]
p2 -= 1
elif p2 == -1:
nums1[tail] = nums1[p1]
p1 -= 1
elif nums1[p1] > nums2[p2]:
nums1[tail] = nums1[p1]
p1 -= 1
else:
nums1[tail] = nums2[p2]
p2 -= 1
tail -= 1
java
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
}
C
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}