力扣——C语言:合并两个有序数组

发布时间:2024年01月09日

88. 合并两个有序数组 - 力扣(LeetCode)

这道题有多种方法可以解决

一、暴力求解

这种方法最简单,我们只需要把两个数组合在一起然后在冒泡排序就可以了

代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i=m,j=0;i<nums1Size;i++,j++)
    {
        nums1[i] = nums2[j];
    }

    for (int i=0;i<nums1Size-1;i++)
    {
        for (int j=0;j<nums1Size-1;j++)
        {
            if (nums1[j+1] < nums1[j])
            {
                int temp = nums1[j];
                nums1[j] = nums1[j+1];
                nums1[j+1] = temp;
            }
        }
    }
}

第一个for循环就是用来合并两个数组

第二个for循环嵌套就是排序了

虽然很简单易懂,但它的缺点是时间复杂度比较高,所以这种解法并不是特别好

二、双指针

注:很多人都会认为双指针方法指的是使用两个指针,但这里的双指针并不是指使用两个指针,而是用两个变量表示数组的下标,像指针一样一个一个遍历

代码如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i = m-1;
    int j = n-1;
    int k = m+n-1;
    while (j>=0 || i>=0)
    {
        if (i<0)
        {
            nums1[k] = nums2[j];
            j--;
            k--;
        }
        else if (j < 0)
        {
            nums1[k] = nums1[i];
            i--;
            k--;
        }
        else if (nums1[i] < nums2[j])
        {
            nums1[k] = nums2[j];
            j--;
            k--;
        }
        else
        {
            nums1[k] = nums1[i];
            i--;
            k--;
        }
    }
}

i是第一个数组下标有数值的末尾,j是第二个数组下标有数值的末尾,k是整个数组合在一起之后的末尾

先看后面两个条件判断最容易理解,先比较两头末尾谁大,因为这两个数是两个数组中的老大,所以谁大谁就是最大的那个数,自然就要放在第一位,然后就要开始老二之争,以此类推

前面两个条件判断是当一方已经放数值结束了之后,另一边有数值就要补上去剩下的位置

最后我们想要的排好序的数组自然就是第一个数组了

感谢观看,希望对你有所帮助

--------------------------------------------------------------------------------------------------------------

文章来源:https://blog.csdn.net/2301_80655639/article/details/135487740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。