码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode88. 合并两个有序数组

时间:2021-06-16 18:05:16      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:存储   素数   指针   排列   思路   初始   java   长度   说明   

LeetCode88. 合并两个有序数组

题目说明

/**
     * 
     * 给你两个有序整数数组 nums1 和 nums2,
     * 请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
     * <p>
     * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
     * 你可以假设 nums1 的空间大小等于 m + n,
     * 这样它就有足够的空间保存来自 nums2 的元素。
     * 
     */

思路分析

  1. 因为给定的数组是有序的,即按照升序排列的,假定数组1的长度为两数组长度之和,将合并后的元素存储到数组1中
  2. 可以使用逆向遍历法,即从数组的后边往前遍历,因为数组的后边元素更大,而且数组1后边的部分元素是空的,从后往前依次比较两个数组中元素的大小,将较大者依次存储数组1的后边
  3. 当某一数组中其他元素全部取完后,则直接从剩下的一个数组中取
  4. 源码见下

源码及分析

/**
     *
     * @param nums1 要合并的数组1
     * @param m 数组1的长度
     * @param nums2 要合并的数组2
     * @param n 数组2的长度
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        //定义两个指针指向两个数组末尾,从后往前遍历,因为数组是有序的,即数组后边的元素大于前边的
        int i = m - 1, j = n - 1;
        //再定义指针k用于将数组中比较后较大的值依次放入数组末尾,cur记录当前的较大的数
        int k = m + n - 1, cur = 0;
        //循环扫描两个数组
        while (i >= 0 || j >= 0) {
            //如果第一个数组已经扫描完毕,则将第二个数组的所有元素全部放入num1
            if (i == -1) {
                cur = nums2[j];
                j--;
                //同理如果第二个数组扫描完毕
            } else if (j == -1) {
                cur = nums1[i];
                i--;
                //比较两个数组中末尾的元素大小,将大者先放入num1
            } else if (nums1[i] > nums2[j]) {
                cur = nums1[i];
                i--;
            } else {
                cur = nums2[j];
                j--;
            }
            //循环将较大者存入数组
            nums1[k] = cur;
            k--;
        }

    }

LeetCode88. 合并两个有序数组

标签:存储   素数   指针   排列   思路   初始   java   长度   说明   

原文地址:https://www.cnblogs.com/mx-info/p/14887948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!