题目链接:
https://leetcode.cn/problems/merge-sorted-array/
以下是使用Go语言实现外观数列问题的代码:
func merge(nums1 []int, m int, nums2 []int, n int) {
p1 := m - 1
p2 := n - 1
p := m + n - 1
for p1 >= 0 && p2 >= 0 {
if nums1[p1] >= nums2[p2] {
nums1[p] = nums1[p1]
p1--
} else {
nums1[p] = nums2[p2]
p2--
}
p--
}
for p2 >= 0 {
nums1[p] = nums2[p2]
p2--
p--
}
}
执行用时:4 ms, 在所有 Go 提交中击败了29.68%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了55.02%的用户
通过测试用例:59 / 59
这个问题可以使用双指针法解决。我们定义两个指针p1和p2分别指向nums1和nums2的末尾元素,同时定义一个指针p指向nums1的合并后的末尾位置。
从后往前遍历nums1和nums2,比较nums1[p1]和nums2[p2]的大小,将较大的元素放入nums1[p]的位置,并将相应的指针向前移动。重复这个过程,直到遍历完nums1和nums2中的所有元素。
具体的实现步骤如下:
- 初始化指针p1为m - 1,指针p2为n - 1,指针p为m + n - 1。
- 当p1和p2都大于等于 0 时,执行以下步骤:
- 如果nums1[p1]大于等于nums2[p2],将nums1[p1]赋值给nums1[p],并将p1指针向前移动一位。
- 否则,将nums2[p2]赋值给nums1[p],并将p2指针向前移动一位。
- 将p指针向前移动一位。
- 如果p2大于等于 0,说明nums2中还有剩余的元素未合并,将剩余的元素逐个复制到nums1中。
这段代码的时间复杂度为O(m + n),因为我们只需要遍历一遍nums1和nums2的元素。同时,我们没有使用额外的空间来存储合并后的数组,所以空间复杂度为O(1)。