一、题目
二、解题思路
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
#include
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];
}
}