Сортировка слиянием в Python: сортировка связанного списка

Вот объяснение того, как реализовать сортировку слиянием в связанном списке в Python:

Чтобы выполнить сортировку слиянием в связанном списке, мы можем выполнить следующие действия:

  1. Определите класс Node. Начните с определения класса Node, который представляет узел в связанном списке. Каждый узел должен иметь значение и указатель на следующий узел.
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
  1. Разделение связанного списка: напишите функцию, которая разделит связанный список на две половины. Вы можете использовать технику быстрого и медленного указателя, чтобы найти средний узел, а затем разделить список на две половины.
def split_linked_list(head):
    if head is None or head.next is None:
        return head, None
    slow = head
    fast = head.next
    while fast is not None:
        fast = fast.next
        if fast is not None:
            fast = fast.next
            slow = slow.next
    second_half = slow.next
    slow.next = None
    return head, second_half
  1. Объединить два отсортированных связанных списка. Реализуйте функцию для объединения двух отсортированных связанных списков в один отсортированный список. Это можно сделать рекурсивно, сравнив значения узлов и создав новый объединенный список.
def merge_sorted_lists(left, right):
    if left is None:
        return right
    elif right is None:
        return left
    if left.value <= right.value:
        result = left
        result.next = merge_sorted_lists(left.next, right)
    else:
        result = right
        result.next = merge_sorted_lists(left, right.next)
    return result
  1. Реализовать сортировку слиянием. Наконец, реализуйте алгоритм сортировки слиянием, рекурсивно разбивая связанный список на половины, сортируя каждую половину, а затем объединяя их обратно.
def merge_sort(head):
    if head is None or head.next is None:
        return head
    left, right = split_linked_list(head)
    left = merge_sort(left)
    right = merge_sort(right)
    return merge_sorted_lists(left, right)

Вот и все! Теперь вы можете использовать функцию merge_sort()для сортировки связанного списка с использованием алгоритма сортировки слиянием.