> 文档中心 > 力扣Java - 88. 合并两个有序数组

力扣Java - 88. 合并两个有序数组

合并两个有序数组

  • 题目描述
  • 示例演示
        • 示例一
        • 示例二
        • 示例三
  • 算法思想
  • 算法代码

题目描述

  • 两个按非递减顺序排列的整数数组 nums1nums2
  • nums1 数组元素个数 m 个;nums2 数组元素个数 n 个。
  • 要求:合并 nums2 到 nums1 中,使合并后的数组按非递减顺序排列。
  • 非递减顺序:整体呈现递增趋势,但是允许存在数值相等的元素,并不是严格递增。

注意:

  • 合并后数组不应由函数返回,而是存储在数组 nums1 中。
  • nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例演示

示例一

输入: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 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果: [1] 。

示例三

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

算法思想

  • 我是借助了一个临时的int型数组temp,该数组的长度为 m + n。
  • 使用while循环遍历数组。第一个while循环是用来挨个比较 nums1 数组和 nums2 数组元素的大小,将较小者存储到 temp 数组中,同时对下标执行自增操作。
  • 当第一个while循环的条件不满足时,说明 nums1 和 nums2 数组中有一个数组的元素已经全部存储在了 temp 数组中了,无需再进行两个数组元素的比较工作。
  • 第2个和第3个 while 循环只能执行一个,将数组中剩余元素依次添加到 temp 数组中。
  • 当全部执行完毕后,使用 for 循环将 temp 数组中的元素赋值到 nums1 数组中,因为题目要求存储到 nums1 数组。

算法代码

class Solution {    public void merge(int[] nums1, int m, int[] nums2, int n) { int[] temp = new int[m+n]; int i = 0, j = 0, k = 0; while( i < m && j < n){     if( nums1[i] < nums2[j] ){  temp[k++] = nums1[i++];     }else{  temp[k++] = nums2[j++];     } } while( i < m ){     temp[k++] = nums1[i++]; } while( j < n ){     temp[k++] = nums2[j++]; } for (int x = 0; x < temp.length; x++){     nums1[x] = temp[x]; }    }}

力扣Java - 88. 合并两个有序数组 创作打卡挑战赛 力扣Java - 88. 合并两个有序数组 赢取流量/现金/CSDN周边激励大奖