给定两个已排序的整数数组nums1和nums2,将nums2合并为nums1作为一个已排序的数组。
1. 在nums1和nums2中初始化的元素数分别为m和n
2. 假设nums1有足够的空间(大小大于或等于m + n)来容纳nums2中的其他元素
Input: nums1=[1,2,4,5,6,0] nums2=[3]
m=5 n=1
Output: [1,2,3,4,5,6]
把nums1中m~m+n的元素替换成nums2的元素
只需要一个for循环,因为for i in range(m,m+n),i每次都+1但是基数是m,所以想要从nums2的第1个数开始就i-m就可以了。
把两个列表合并之后,所以写sort排序,over。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
j=m+n
for i in range(m,j):
nums1[i]=nums2[i-m]
return nums1.sort()
(一年之后再看自己写的东西, 写的个啥玩意)
Java
选择倒序, 将两个数组中大的那个插入到后面
- 建立两个指针, 分别指向nums1和nums2的最大的数
- 建立一个for遍历两个数组, 并将最大的数添加到nums1末尾
- 当nums1数遍历完并且nums2还有时,将所有nums2的数按顺序添加到nums1上
- 当nums2遍历完,nums1还有时,直接返回,因为数组本来就是升序的
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int n1 = m - 1, n2 = n - 1;
for (int i = m + n - 1; i >= 0; i--) {
if(n1>=0&&n2>=0) {
if (nums1[n1] > nums2[n2]) {
nums1[i] = nums1[n1];
n1--;
} else {
nums1[i] = nums2[n2];
n2--;
}
} else if (n1 < 0) {//注意当出现nums1=[0] nums2=[1]类似的情况时,只剩nums2
nums1[i] = nums2[n2];
n2--;
}else{
return;
}
}
}
}
时间复杂度O(M+N)