

Вот шаги для решения этой проблемы:
- Мы начинаем с инициализации 3 указателей, i, j и k, которые будут использоваться для обхода массивов
nums1иnums2. iначинается сm - 1, так какnums1имеетmэлементов, и нам нужно сравнить элементы с концаnums1.jначинается сn - 1, так какnums2имеетnэлементов, и нам нужно сравнить элементы с концаnums2.kначинается сm + n - 1, так как результирующий массивnums1имеетm + nэлементов, и нам нужно начать с концаnums1.- В первом цикле while мы сравниваем элементы в конце
nums1иnums2и помещаем больший из двух в конецnums1. - Во втором цикле while мы добавляем все оставшиеся элементы
nums2в конецnums1.
Вот решение на Python:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
i, j, k = m - 1, n - 1, m + n - 1
while i >= 0 and j >= 0:
if nums1[i] >= nums2[j]:
nums1[k] = nums1[i]
i -= 1
else:
nums1[k] = nums2[j]
j -= 1
k -= 1
while j >= 0:
nums1[k] = nums2[j]
k -= 1
j -= 1
Вот то же решение в Javascript
var merge = function(nums1, m, nums2, n) {
let i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] >= nums2[j]) {
nums1[k] = nums1[i];
i--;
} else {
nums1[k] = nums2[j];
j--;
}
k--;
}
while (j >= 0) {
nums1[k] = nums2[j];
k--;
j--;
}
};
Временная сложность приведенных выше решений составляет O(m + n):.
- Два цикла while выполняются не более
m + nраз. В худшем случае по одному элементу из каждого из массивовnums1иnums2сравнивается и добавляется кnums1на каждой итерации. - Следовательно, временная сложность решения равна
O(m + n).
Пространственная сложность приведенных выше решений равна O(1):.
- Решение изменяет массив
nums1на месте и не требует никаких дополнительных структур данных. - Объемная сложность решения составляет
O(1), так как решение использует только несколько переменных для указателей.