CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

    • 双指针法理论基础
    • 左右指针

    • 滑动窗口

    • 快慢指针

    • 其他

      • 合并两个有序链表
      • 合并两个有序数组
        • 📃 题目描述
        • 🔔 解题思路
          • 双指针
          • 逆向双指针
        • 💥 复杂度分析
      • 两数相加
      • 链表中的两数相加
      • 字符串相加
      • 大数相减
      • 比较版本号
      • 寻找两个正序数组的中位数
      • 奇偶链表
      • 剑指Offer.替换空格
  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 双指针法
  • 其他
小牛肉
2022-08-07
目录

合并两个有序数组

# 📃 题目描述

题目链接:88. 合并两个有序数组 (opens new window)

# 🔔 解题思路

# 双指针

需要新开一个数组

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if (nums2 == null || nums2.length == 0) {
            return ;
        }

        int[] nums3 = new int[m + n];

        int p1 = 0;
        int p2 = 0;
        int p3 = 0;

        while (p1 < m && p2 < n) {
            if (nums1[p1] < nums2[p2]) {
                nums3[p3 ++] = nums1[p1 ++];
            }
            else {
                nums3[p3 ++] = nums2[p2 ++];
            }
        }

        while (p1 < m) {
            nums3[p3 ++] = nums1[p1 ++];
        }
        while (p2 < n) {
            nums3[p3 ++] = nums2[p2 ++];
        }

        for (int i = 0; i < nums1.length; i ++) {
            nums1[i] = nums3[i];
        }
        
    }
}

# 逆向双指针

nums1 的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums1 的最后面

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if (nums2 == null || nums2.length == 0) {
            return ;
        }

        // 从后往前遍历
        int p1 = m - 1;
        int p2 = n - 1;
        int tail = nums1.length - 1;
        while (p2 >= 0) {
            // p1 < 0 (p1 遍历完了但 p2 还没遍历完,直接把 p2 的剩余元素依次放到 nums1 的剩余空间就行了
            if (p1 < 0 || nums2[p2] >= nums1[p1]) {
                nums1[tail --] = nums2[p2 --];
            }
            else {
                nums1[tail --] = nums1[p1 --];
            }
        }
    }
}

# 💥 复杂度分析

  • 空间复杂度:
  • 时间复杂度:

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
合并两个有序链表
两数相加

← 合并两个有序链表 两数相加→

最近更新
01
关于编程满天星
02
让我来告诉你 Java 程序员是怎么一步一步从入行到被裁的
06-08
03
Vision Pro,未来已来
06-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式