链表中的归并排序

Merge-sort in a Linked List

我目前正在练习或面试,正在为链表问题做归并排序。

给定一个链表(具有 nextval 属性),4-2-1-3,我应该将其排序为 1-2-3-4 in O(nlogn) .因此,我尝试对链表使用归并排序。下面是我的代码。

def sortList(self, head):
    """
    :type head: ListNode
    :rtype: ListNode
    """

    if head.next:

        # find mid point

        mid = fast = head
        while fast.next and fast.next.next:
            mid = mid.next
            fast = fast.next.next

        # split linkedList into two

        L = head
        R = mid.next
        mid.next = None

        # recursively call mergeSort to Left and Right Lists

        self.sortList(L)
        self.sortList(R)

        # pointers for merging

        newPtr = newHead = ListNode(-1)
        newHead.next = newPtr

        # merge and sort

        while L and R:
            if L.val < R.val:
                newPtr.next = L
                L = L.next
            else:
                newPtr.next = R
                R = R.next
            newPtr = newPtr.next
        # for remaining nodes
        while L:
            newPtr.next = L
            newPtr = newPtr.next
            L = L.next
        while R:
            newPtr.next = R
            newPtr = newPtr.next
            R = R.next

        return newHead.next

    else:
        return head

我觉得我的归并排序算法是正确的,但上面输入的结果让我 1-3-4 缺少 2

我觉得我真的很接近,但我不确定我搞砸了哪一部分。

请帮忙。

编辑

我通过将 LR 更改为 l1l2 并更改

解决了这个问题
        self.sortList(L)
        self.sortList(R)

这个给

        L = self.sortList(l1)
        R = self.sortList(l2)

其他部分相同,现在我有相同的答案。但是,我不确定更改是如何产生差异的。

递归调用sortList时,局部函数变量R和L可能不再是各自链表段的头部。随后的合并操作将 "skip" 排序列表中位于原始节点之前的部分,导致输出不完整。

您的更改确保 R 和 L 具有每个子列表的有效头部,通过将它们重新分配给已排序链的头部来合并。