
描述
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 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]
思路
解一
由于nums1已经是排序了的,我们能参考插入排序的思想,将nums2中的元素,逐个与nums1末尾的元素进行比较,直到找到合适的位置插入为止。
1 | class Solution { |
该算法的时间复杂度不理想,时间复杂度为 O(N*M)
解二
双指针思想
p为nums1的末尾,q为新插入的位置。
从后面开始遍历数组nums2,逐个比较nums[i] 与 nums1[p] 的值
如果 nums1[p] > nums2[i] ,交换p,q指标的值,一直循环到nums1[p] <= nums2[i],将大的值nums2[i]放置q位置
1 | public class MergeArr { |
时间复杂度为O(N+M),空间复杂度为O(1)
参考
参一
直接使用jdk源码数组拷贝
1 | class Solution { |
参二
逐个比较,比较大的放置后面,只是末尾需要额外的复制,最坏情况下,时间复杂度为O((n+m)log(n+m))
1 | class Solution { |
最好时间复杂度O(N+M)
github
代码链接见上面👆