合并两个有序数组

  • 题目
  • 函数原型
  • 边界判断
  • 算法设计:双指针
  • 算法设计:双指针



 


题目

给你两个有序整数数组 [88].合并两个有序数组_双指针[88].合并两个有序数组_算法设计_02,请你将 [88].合并两个有序数组_算法设计_02 合并到 [88].合并两个有序数组_双指针 中,使 [88].合并两个有序数组_双指针

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

说明:

  • 初始化 [88].合并两个有序数组_i++_06[88].合并两个有序数组_双指针_07 的元素数量分别为 [88].合并两个有序数组_算法设计_08[88].合并两个有序数组_双指针_09
  • 你可以假设 [88].合并两个有序数组_i++_06 有足够的空间(空间大小大于或等于 [88].合并两个有序数组_双指针_11)来保存 [88].合并两个有序数组_双指针_07

 


函数原型

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;
}
  • 时间复杂度:[88].合并两个有序数组_双指针_13
  • 空间复杂度:[88].合并两个有序数组_i++_14

 


算法设计:双指针

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--];
}
  • 时间复杂度:[88].合并两个有序数组_双指针_13
  • 空间复杂度:[88].合并两个有序数组_双指针_16