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 ; }
思想是一致的,不过该方法采用倒序的方式来求,可以减少变量的使用,参考。