数据结构初阶之顺序表数组OJ题三——合并两个有序数组

数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第1张图片

题目链接:https://leetcode-cn.com/problems/merge-sorted-array

解题思路:三指针

先创建三个指针,一个指针 i 指向nums1的m-1处,一个指针 j 指向nums2的n-1处,一个指针dest指向nums1的m+n-1处,然后让 i 与 j 比较,将较大的往dest处放

数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第2张图片

i和j比,i小于j,所以dest=j,dest--,j--

 数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第3张图片

 i和j比,i小于j,所以dest=j,dest--,j--

数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第4张图片

i和j比,i大于j,所以dest=i,dest--,i--

 数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第5张图片

i和j相等,放谁都可以,所以dest=j,dest--,j--

 数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第6张图片

而此时的j结束了,所以循环结束,但是这里要注意一个问题,就是如果要是nums1的m个元素要是都大于nums2,就会出现如下情况,i走完了,但是j一步没走,所以跳出循环后,必须要判断j是否小于0,如果小于,则需要将j放入nums1中

数据结构初阶之顺序表数组OJ题三——合并两个有序数组_第7张图片

代码如下:

//注:这里的nums1Size和nums2Size多余没用
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int i = m - 1;
    int j = n - 1;
    int dest = m + n - 1;
    while (i >= 0 && j >= 0)
    {
        //当i大于j时,将i赋值给dest
        if (nums1[i] > nums2[j])
        {
            nums1[dest--] = nums1[i--];
        }
        //当i小于j时,将j赋值给dest
        else
        {
            nums1[dest--] = nums2[j--];
        }
    }

    //当出现nums1数组中的所有元素大于nums2数组的全部的元素时
    while (j >= 0)
    {
        nums1[dest--] = nums2[j--];
    }
}

你可能感兴趣的:(#,初级数据结构,#,练习题,#,C语言,数据结构,c语言)