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是整个数组合在一起之后的末尾
先看后面两个条件判断最容易理解,先比较两头末尾谁大,因为这两个数是两个数组中的老大,所以谁大谁就是最大的那个数,自然就要放在第一位,然后就要开始老二之争,以此类推
前面两个条件判断是当一方已经放数值结束了之后,另一边有数值就要补上去剩下的位置
最后我们想要的排好序的数组自然就是第一个数组了
感谢观看,希望对你有所帮助
--------------------------------------------------------------------------------------------------------------
完