【LeetCode】手撕系列—88. 合并两个有序数组_双指针

本文详细描述了一种合并两个有序数组的算法,使用Java实现,通过指针操作和比较元素值,将nums1和nums2中的元素合并到一个新的有序数组中。
摘要由CSDN通过智能技术生成


1- 思路

定义三个指针 p1、p2 以及 cur;其中 p1 用于遍历 nums1;p2用于遍历 nums2;cur 为判断当前存储的元素
定义一个 sorted 数组长度为 (m+1),存储合并后的数组

  • 四个判断
    • if( p1 == m):此时表明,nums1中的数据已经存储完,则 cur = nums2[p2++]
    • if( p2 == n):此时表明,nums2中的数据已经存储完,则 cur = nums1[p1++]
    • if(nums1[p1] < nums2[p2]):则 cur = nums1[p1++]
    • 剩余最后一个条件 cur = nums2[p2++]
  • 收集结果

2- 题解

⭐合并两个有序数组 ——题解思路

在这里插入图片描述

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1=0 , p2=0;
        int[] sorted = new int[m+n];

        int cur;
        while(p1<m || p2<n){
            if(p1 == m){
                cur = nums2[p2++];
            }else if(p2 == n){
                cur = nums1[p1++];
            }else if(nums1[p1] < nums2[p2]){
                cur = nums1[p1++];
            }else{
                cur = nums2[p2++];
            }
            sorted[p1+p2-1] = cur;
        }

        for(int i = 0 ; i != m+n;i++){
            nums1[i] = sorted[i];
        }
    }
}

3- ACM模式

public class merge {
    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1=0 , p2=0;
        int[] sorted = new int[m+n];

        int cur;
        while(p1<m || p2<n){
            if(p1 == m){
                cur = nums2[p2++];
            }else if(p2 == n){
                cur = nums1[p1++];
            }else if(nums1[p1] < nums2[p2]){
                cur = nums1[p1++];
            }else{
                cur = nums2[p2++];
            }
            sorted[p1+p2-1] = cur;
        }

        for(int i = 0 ; i != m+n;i++){
            nums1[i] = sorted[i];
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        scanner.nextLine(); // Consume newline left-over

        int[] nums1 = new int[m + n]; // Assuming nums1 has enough space to hold additional elements from nums2
        int[] nums2 = new int[n];

        // Reading nums1 elements
        for (int i = 0; i < m; i++) {
            nums1[i] = scanner.nextInt();
        }
        scanner.nextLine(); // Consume newline left-over

        // Reading nums2 elements
        for (int i = 0; i < n; i++) {
            nums2[i] = scanner.nextInt();
        }

        merge(nums1, m, nums2, n);

        // Output the merged array
        for (int i = 0; i < m + n; i++) {
            System.out.print(nums1[i] + " ");
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值