💡Задача: Сортировочный список
Условие: дан односвязный список, необходимо отсортировать узлы списка по значению в порядке возрастания
Пример:
Ввод: head = [4,2,1,3]
Вывод: [1,2,3,4]
Ввод: head = [-1,5,3,4,0]
Вывод: [-1,0,3,4,5]
Можете ли вы отсортировать связанный список за O (n logn) времени и O(1) памяти (т.е. постоянного пространства)?
Решение:
пишите свое решение в комментариях 👇
@csharp_ci
Условие: дан односвязный список, необходимо отсортировать узлы списка по значению в порядке возрастания
Пример:
Ввод: head = [4,2,1,3]
Вывод: [1,2,3,4]
Ввод: head = [-1,5,3,4,0]
Вывод: [-1,0,3,4,5]
Можете ли вы отсортировать связанный список за O (n logn) времени и O(1) памяти (т.е. постоянного пространства)?
Решение:
public class Solution
{
public ListNode SortList(ListNode head)
{
if (head == null)
return null;
if (head.next == null)
return head;
var tail = head;
var mid = head;
var prev = head;
while (tail != null && tail.next != null)
{
tail = tail.next.next;
prev = mid;
mid = mid.next;
}
prev.next = null;
return MergeTwoLists(SortList(head), SortList(mid));
}
ListNode MergeTwoLists(ListNode list1, ListNode list2)
{
var head = new ListNode();
var newNode = head;
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
newNode.next = list1;
newNode = list1;
list1 = list1.next;
}
else
{
newNode.next = list2;
newNode = list2;
list2 = list2.next;
}
}
newNode.next = list1 ?? list2;
return head.next;
}
}
пишите свое решение в комментариях 👇
@csharp_ci