合并两个有序数组
- 题目
- 函数原型
- 边界判断
- 算法设计:双指针
- 算法设计:双指针
题目
给你两个有序整数数组 和 ,请你将 合并到 中,使
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
说明:
- 初始化 和 的元素数量分别为 和
- 你可以假设 有足够的空间(空间大小大于或等于 )来保存
函数原型
C
的函数原型:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){}
边界判断
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){}
算法设计:双指针
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i, j, k;
i = j = k = 0;
int *nums = calloc(nums1Size, sizeof(int));
while( (i < m) && (j < n) ){
if( nums1[i] < nums2[j] )
nums[k++] = nums1[i++];
else
nums[k++] = nums2[j++];
}
while( i < m )
nums[k++] = nums1[i++];
while( j < n )
nums[k++] = nums2[j++];
for(int i=0; i<nums1Size; i++)
nums1[i] = nums[i];
free(nums), nums = NULL;
}
- 时间复杂度:
- 空间复杂度:
算法设计:双指针
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int i, j, k;
for( i = m-1, j = n-1, k = m+n-1; (i >= 0 && j >= 0); (k--) )
(nums1[i] > nums2[j]) ? (nums1[k] = nums1[i--]) : (nums1[k] = nums2[j--]);
while( j >= 0 )
nums1[k--] = nums2[j--];
}
- 时间复杂度:
- 空间复杂度: