Merge Two Sorted Lists
https://leetcode.com/problems/merge-two-sorted-lists/description/ | Easy |
Условие
Даны два отсортированных по возрастанию связанных списка. Необходимо слить их в один отсортированный список и вернуть его.
Примеры
Input:
list1 = [1, 2, 4], list2 = [1, 3, 4]Output:
[1, 1, 2, 3, 4, 4]
Input:
list1 = [], list2 = []Output:
[]
Input:
list1 = [], list2 = [0]Output:
[0]
Решение
// Определение структуры узла связанного списка
class ListNode(var value: Int) {
var next: ListNode? = null
}
fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
// Создаем новый пустой узел для начала объединенного списка
var dummy = ListNode(0)
var current = dummy
// Пока оба списка непустые, продолжаем сравнивать их элементы
var p1 = list1
var p2 = list2
while (p1 != null && p2 != null) {
if (p1.value <= p2.value) {
// Если значение в первом списке меньше или равно, добавляем его в результат
current.next = p1
p1 = p1.next
} else {
// Если значение во втором списке меньше, добавляем его в результат
current.next = p2
p2 = p2.next
}
// Переходим к следующему узлу результата
current = current.next!!
}
// Добавляем оставшиеся элементы, если один из списков пуст
current.next = p1 ?: p2
// Возвращаем объединенный список (пропуская вспомогательный узел)
return dummy.next
}
Временная сложность
O(n + m), где n и m — количество элементов в списках list1 и list2, так как мы проходим по каждому элементу обоих списков один раз.
Пространственная сложность
O(1), если не учитывать память, выделенную под новый список. Мы используем фиксированное количество дополнительных переменных.