Merge Two Sorted Lists - LeetCode
----- Условие ----- Даны два отсортированных связных списка. Требуется объединить в один отсортированный список.
----- Решение ----- 1) Устанавливаем первый узел: берем с наименьшим val из первых узлов списков, сдвигаем указатель списка, значение которого было использовано. 2) В цикле проходимся по спискам до тех пор, пока один из них не закончится, устанавливая next результирующего списка на узел с меньшим значением и сдвигая указатель списка, значение которого было использовано. В результате list1 и list2 сокращаются, а newList заполняется отсортированными узлами. 3) Оставшуюся часть непустого списка добавляем в результирующий.
Сложность алгоритма по времени O(n + m), где n и m - длины списков, сложность по памяти O(1), так как мы не создаем новых узлов, а лишь переиспользуем текущие.
----- Код ----- /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} list1 * @param {ListNode} list2 * @return {ListNode} */ const mergeTwoLists = function(list1, list2) { if (!list1 && !list2) return null; if (list1 && !list2) return list1; if (list2 && !list1) return list2; let newList;
if (list1.val < list2.val) { newList = list1; list1 = list1.next; } else { newList = list2; list2 = list2.next; }
let newListTail = newList;
while (list1 && list2) { if (list1.val > list2.val) { newListTail.next = list2; list2 = list2.next; } else { newListTail.next = list1; list1 = list1.next; }
newListTail = newListTail.next; }
newListTail.next = list1 ? list1 : list2;
return newList; };