Leetcode 88题.合并两个有序数组
题目描述:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解题思路:
从最后面的数比较开始,定义三个指针,指针 i 指向有序数组nums1的最大数,指针 j 指向nums2数组的最大数, 指针 k 指向数组nums1最后的索引即 k = m +n - 1.
从后面比较nums1与nums2,逐渐将两个数组的数按照从大到小从后面插入到数组nums1中。
这里要注意两点:
(1)m=0的情况,即有序数组nums1是没有非零整数的。
(2)当指针i遍历完后, 指针 j 可能还没遍历完数组nums2,所以后面要再加一个循环将nums2剩余的数插入到nums1中。
C++实现:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1, j=n-1, k=m+n-1;
if(m==0) nums1[k] = nums2[j];
while(j >= 0 && i >= 0){
if(nums1[i] < nums2[j]){
nums1[k--] = nums2[j--];
}
else if (nums1[i] > nums2[j]){
nums1[k--] = nums1[i--];
}
else{
nums1[k--] = nums2[j--];
nums1[k--] = nums1[i--];
}
}
while(j >= 0){
nums1[k--] = nums2[j--];
}
}
};
java实现:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i=m-1, j=n-1, k=m+n-1;
if(m==0) nums1[k] = nums2[j];
while(j >= 0 && i >= 0){
if(nums1[i] < nums2[j]){
nums1[k--] = nums2[j--];
}
else if (nums1[i] > nums2[j]){
nums1[k--] = nums1[i--];
}
else{
nums1[k--] = nums2[j--];
nums1[k--] = nums1[i--];
}
}
while(j >= 0){
nums1[k--] = nums2[j--];
}
}
}
python实现:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
i, j, k = m-1, n-1, m+n-1
if m==0:
nums1[k] = nums2[j]
while j >= 0 and i >= 0:
if nums1[i] < nums2[j]:
nums1[k] = nums2[j]
k -= 1
j -= 1
elif nums1[i] > nums2[j]:
nums1[k] = nums1[i]
k -= 1
i -= 1
else:
nums1[k] = nums2[j]
k -= 1
j -= 1
nums1[k] = nums1[i]
k -= 1
i -= 1
while j >= 0:
nums1[k] = nums2[j]
k -= 1
j -= 1
249




被折叠的 条评论
为什么被折叠?



