原题:Leetcode88 合并两个有序数组
https://leetcode-cn.com/problems/merge-sorted-array/
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存nums2中的元素
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
最简单的方法直接用系统自带的排序算法,先合并后排序
public class Solution {
public void Merge(int[] nums1, int m, int[] nums2, int n) {
for (int i = 0;i < nums2.Length; i++)
{
nums1[m + i] = nums2[i];
}
nums1 = nums1.OrderBy(a => a).ToArray();
}
}
另一种方法。
之前有做过合并用ListNode节点构成的循环单链表。那里我是新建的一个head节点,然后根据有序链表的逻辑关系来在head后面添加节点构成答案需要的链表。这里想用同样的方法,先定义长度为m+n的数组(初值为0),然后去更改里面的值,这是很自然而然就能想到的方法,缺点是浪费内存。
public static int[] Merge(int[] nums1, int m, int[] nums2, int n)
{
int[] res = new int[m+n];
int i = 0, j = 0, k = 0;
while (i<m||j<n)
{
if(i == m)
{
while (j <n )
{
res[k] = nums2[j];
k++;
j++;
}
break;
}
if (j == n)
{
while (i < m)
{
res[k] = nums1[i];
k++;
i++;
}
break;
}
if (nums1[i] <= nums2[j])
{
res[k] = nums1[i];
k++;
i++;
}
else
{
res[k] = nums2[j];
k++;
j++;
}
}
return res;
}
static void Main(string[] args)
{
int[] nums1 = new int[6] { 1, 2, 3, 0, 0, 0 };
int[] nums2 = new int[3] { 2, 5, 6 };
int m = 3, n = 3;
int[] res = Merge(nums1, m, nums2, n);
for(int i=0;i<res.Length;i++)
{
Console.WriteLine(res[i]);
}
}
}
}