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

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

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

一、暴力求解

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

代码如下:

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

第一个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是整个数组合在一起之后的末尾

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

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

力扣——C语言:合并两个有序数组_第1张图片

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

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

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

你可能感兴趣的:(leetcode,算法,职场和发展)