leecode-C语言实现-88. 合并两个有序数组

一、题目
在这里插入图片描述在这里插入图片描述
二、解题思路
1、思路1
两个有序数组进行合并,可以想象成插入排序,将有序数组b中的元素逐一遍历插入到有序数组a中,当b中某个元素小于等于其中的某个元素时,将此元素包含此元素右边的有效元素(非零的值)进行右移一位,移动完成后,再进行更新当前匹配的值,最后在跳出内层循环,因为后续元素不需要再进行遍历。如果没有匹配到元素,只需在数组a的尾部加上此元素即可,之后便可以继续比对有序数组b中的下一个元素。

2、思路2
如下数组,进行合并,可以使用单层循环加上临时数组的方式,定义三个变量分别代表三组数组的当前索引,两数组中各取一个数进行比较,比较之后较小的一个放到临时数组中,如果比较之后相等的,将两个相等的值都加入到临时数组中。当某个数组没有遍历完时,可以对此数组的后续元素单独遍历,由于我们写的方法需要有通用性,所以需加上两个数组的单独遍历。
nums1 = [1,0,2,3,0,0,0], m = 4, nums2 = [2,5,6], n = 3
0
0
0
3
2 6
0 5
1 2
三、虚机测试代码

#include <stdio.h>
#include <stdlib.h>

void main()
{
    void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n);
    void PrintfArray(int *array ,int size);
    void merge_v0(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n);
/*
    int nums1[] = {-1,0,0,3,3,3,0,0,0};
    int m = 6;
    int nums2[] = {1,2,2};
    int n = 3;
    int i;
*/

    int nums1[] = {1,2,3,0,0,0};
    int m = 3;
    int nums2[] = {2,5,6};
    int n = 3;
    int i;

/*
    int nums1[] = {1};
    int m = 1;
    int nums2[] = {};
    int n = 0;
    int i;
*/

/*
    int nums1[] = {0};
    int m = 0;
    int nums2[] = {1};
    int n = 1;
    int i;
*/
    PrintfArray(nums1 ,sizeof(nums1)/sizeof(int));
    PrintfArray(nums2 ,sizeof(nums2)/sizeof(int));
    printf("+++++++++++++++++++++++++++\n");
    //merge(nums1, sizeof(nums1)/sizeof(int), m, nums2, sizeof(nums2)/sizeof(int), n);
    merge_v0(nums1, sizeof(nums1)/sizeof(int), m, nums2, sizeof(nums2)/sizeof(int), n);
    printf("+++++++++++++++++++++++++++\n");
    PrintfArray(nums1 ,sizeof(nums1)/sizeof(int));
}

/**
 *输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
 *输出:[1,2,2,3,5,6]
*/

/**
 *[0,0,0,0,0]
 *0
 *[1,2,3,4,5]
 *5
*/

void merge_v0(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    void PrintfArray(int *array ,int size);
    int i,j,x;

    int *array = malloc(sizeof(int) * nums1Size);

    for(i=0,j=0,x=0;(i<m)&&(j<n);)
    {
        printf("nums2[%d] : %d , nums1[%d] : %d\n",j,nums2[j],i,nums1[i]);
        printf("j        : %d , i        : %d , x : %d\n",j,i,x);
        if(nums2[j] > nums1[i])
        {
            printf("judge nums2[j] > nums1[i]\n");
            array[x] = nums1[i];
            i++;
        }
        else if(nums2[j] < nums1[i])
        {
            printf("judge nums2[j] < nums1[i]\n");
            array[x] = nums2[j];
            j++;
        }
        else if(nums2[j] == nums1[i])
        {
            printf("judge nums2[j] == nums1[i]\n");
            array[x] = nums2[j];
            x++;
            array[x] = nums1[i];
            i++;
            j++;
        }
        x++;
        printf("j        : %d , i        : %d , x : %d\n",j,i,x);
        PrintfArray(array ,nums1Size);
        printf("++++++++++++++++++\n");
    }

    for(;i<m;)
    {
        array[x] = nums1[i];
        i++;
        x++;
    }

    for(;j<n;)
    {
        array[x] = nums2[j];
        j++;
        x++;
    }

    for(i=0;i<nums1Size;i++)
    {
        nums1[i] = array[i];
    }
    
    PrintfArray(array ,nums1Size);
}


void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    if(n == 0)
    {
        return 0;
    }
    else if(m == 0)
    {
        int q;
        for(q=0;q<n;q++)
        {
            nums1[q] = nums2[q];
        }
        return 0;
    }
    void PrintfArray(int *array ,int size);
    int i,j,x;
    int flag;

    for(j=0;j<n;j++)
    {
        flag = 1;
        for(i=j;i<m+j;i++)
        {
            printf("nums2[j] : %d , nums1[i] : %d\n",nums2[j],nums1[i]);
            if(nums2[j] <= nums1[i])
            {
                for(x=m+j;x>i;x--)
                {
                    nums1[x] = nums1[x-1];
                }
                nums1[i] = nums2[j];
                flag = 0;
                PrintfArray(nums1 ,nums1Size);
                break;
            }
        }
        if(flag)
        {
            nums1[i] = nums2[j];
            PrintfArray(nums1 ,nums1Size);
        }
    }
}

void PrintfArray(int *array ,int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("%4d",array[i]);
    }
    printf("\n");
}


四、虚机测试截图
在这里插入图片描述

五、leecode提交代码
1、方法一

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    if(n == 0)
    {
        return 0;
    }
    else if(m == 0)
    {
        int q;
        for(q=0;q<n;q++)
        {
            nums1[q] = nums2[q];
        }
        return 0;
    }
    //void PrintfArray(int *array ,int size);
    int i,j,x;
    int flag;

    for(j=0;j<n;j++)
    {
        flag = 1;
        for(i=j;i<m+j;i++)
        {
            //printf("nums2[j] : %d , nums1[i] : %d\n",nums2[j],nums1[i]);
            if(nums2[j] <= nums1[i])
            {
                for(x=m+j;x>i;x--)
                {
                    nums1[x] = nums1[x-1];
                }
                nums1[i] = nums2[j];
                flag = 0;
                //PrintfArray(nums1 ,nums1Size);
                break;
            }
        }
        if(flag)
        {
            nums1[i] = nums2[j];
            //PrintfArray(nums1 ,nums1Size);
        }
    }

}

2、方法二

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int i,j,x;
    int *array = malloc(sizeof(int) * nums1Size);
    for(i=0,j=0,x=0;(i<m)&&(j<n);)
    {
        if(nums2[j] > nums1[i])
        {
            array[x] = nums1[i];
            i++;
        }
        else if(nums2[j] < nums1[i])
        {
            array[x] = nums2[j];
            j++;
        }
        else if(nums2[j] == nums1[i])
        {
            array[x] = nums2[j];
            x++;
            array[x] = nums1[i];
            i++;
            j++;
        }
        x++;
    }
    for(;i<m;)
    {
        array[x] = nums1[i];
        i++;
        x++;
    }
    for(;j<n;)
    {
        array[x] = nums2[j];
        j++;
        x++;
    }
    for(i=0;i<nums1Size;i++)
    {
        nums1[i] = array[i];
    }
}

六、leecode测试结果
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值