1.题目
2.题意
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
3.我的解法
void merge(int* nums1, int m, int* nums2, int n) {
int ptr1,ptr2,ptr,i;
ptr=ptr1=ptr2=0;
int snum;
snum=m+n;
int *numss=(int *)malloc(sizeof(int)*snum);
while(ptr1!=m&&ptr2!=n){
if(nums1[ptr1]<nums2[ptr2]){
numss[ptr++]=nums1[ptr1++];
}
else if(nums1[ptr1]>nums2[ptr2]){
numss[ptr]=nums2[ptr2];
ptr++;ptr2++;
}
else{
numss[ptr++]=nums2[ptr2++];
}
}
while(ptr1!=m){
numss[ptr++]=nums1[ptr1++];
}
while(ptr2!=n){
numss[ptr++]=nums2[ptr2++];
}
for (i=0;i<snum;i++){
nums1[i]=numss[i];
}
}
主要是归并排序的相关概念,分为主指针和两个副指针,反复比较进行移动,最后得出结果。优于100%
4.优秀解法
void merge(int* nums1, int m, int* nums2, int n) {
int i=m-1;
int j=n-1;
int target=m+n-1;
while(i>=0 && j >=0)
{
nums1[target]=(nums1[i]>nums2[j] ? nums1[i--]:nums2[j--]);
target--;
}
if(i<0 && j <0)
return;
if(i<0)
{
while(j>=0)
nums1[target--]=nums2[j--];
}
return ;
}
思想是一致的,不过该方法采用倒序的方式来求,可以减少变量的使用,参考。