列表

详情


88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

 

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

 

提示:

 

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

相似题目

合并两个有序链表

有序数组的平方

区间列表的交集

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { } };

java 解法, 执行用时: 0 ms, 内存消耗: 40.4 MB, 提交时间: 2023-08-13 11:25:39

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1, p2 = n - 1, p = m + n - 1;
        while (p2 >= 0) { // nums2 还有要合并的元素
            // 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
            if (p1 >= 0 && nums1[p1] > nums2[p2]) {
                nums1[p--] = nums1[p1--]; // 填入 nums1[p1]
            } else {
                nums1[p--] = nums2[p2--]; // 填入 nums2[p1]
            }
        }
    }
}

javascript 解法, 执行用时: 52 ms, 内存消耗: 41.1 MB, 提交时间: 2023-08-13 11:25:23

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    let p1 = m - 1, p2 = n - 1, p = m + n - 1;
    while (p2 >= 0) { // nums2 还有要合并的元素
        // 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
        if (p1 >= 0 && nums1[p1] > nums2[p2]) {
            nums1[p--] = nums1[p1--]; // 填入 nums1[p1]
        } else {
            nums1[p--] = nums2[p2--]; // 填入 nums2[p1]
        }
    }
};

golang 解法, 执行用时: 0 ms, 内存消耗: 2.2 MB, 提交时间: 2023-08-13 11:25:04

func merge(nums1 []int, m int, nums2 []int, n int) {
    p1, p2, p := m-1, n-1, m+n-1
    for p2 >= 0 { // nums2 还有要合并的元素
        // 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
        if p1 >= 0 && nums1[p1] > nums2[p2] {
            nums1[p] = nums1[p1] // 填入 nums1[p1]
            p1--
        } else {
            nums1[p] = nums2[p2] // 填入 nums2[p1]
            p2--
        }
        p-- // 下一个要填入的位置
    }
}

python3 解法, 执行用时: 48 ms, 内存消耗: 16.3 MB, 提交时间: 2023-08-13 11:24:44

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        p1, p2, p = m - 1, n - 1, m + n - 1
        while p2 >= 0:  # nums2 还有要合并的元素
            # 如果 p1 < 0,那么走 else 分支,把 nums2 合并到 nums1 中
            if p1 >= 0 and nums1[p1] > nums2[p2]:
                nums1[p] = nums1[p1]  # 填入 nums1[p1]
                p1 -= 1
            else:
                nums1[p] = nums2[p2]  # 填入 nums2[p1]
                p2 -= 1
            p -= 1  # 下一个要填入的位置

python3 解法, 执行用时: 40 ms, 内存消耗: 15.9 MB, 提交时间: 2023-08-13 11:24:13

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(0, n):
            nums1[m+i] = nums2[i]
        for i in range(m, m+n, 1):
            tmp = nums1[i]
            j = i
            while j > 0 and tmp < nums1[j-1]:
                nums1[j] = nums1[j-1]
                j -= 1
            nums1[j] = tmp

golang 解法, 执行用时: 0 ms, 内存消耗: 2.4 MB, 提交时间: 2021-07-14 11:02:01

func merge(nums1 []int, m int, nums2 []int, n int) {
    sorted := make([]int, 0, m+n)
    p1, p2 := 0, 0  // p1, p2 分别指向nums1, nums2的头部
    for {
        if p1 == m {
            sorted = append(sorted, nums2[p2:]...)
            break
        }
        if p2 == n {
            sorted = append(sorted, nums1[p1:]...)
            break
        }
        if nums1[p1] < nums2[p2] {
            sorted = append(sorted, nums1[p1])
            p1++
        } else {
            sorted = append(sorted, nums2[p2])
            p2++
        }
    }
    copy(nums1, sorted)
}

golang 解法, 执行用时: 0 ms, 内存消耗: 2.3 MB, 提交时间: 2021-07-14 10:53:52

func merge(nums1 []int, m int, nums2 []int, n int)  {
    copy(nums1[m:], nums2)
    sort.Ints(nums1)
}

python3 解法, 执行用时: 60 ms, 内存消耗: N/A, 提交时间: 2018-09-05 22:09:20

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        for i in range(0, n):
            nums1[m+i] = nums2[i]
        for i in range(m, m+n, 1):
            tmp = nums1[i]
            j = i
            while j > 0 and tmp < nums1[j-1]:
                nums1[j] = nums1[j-1]
                j -= 1
            nums1[j] = tmp
            
        
                

上一题