链接列表中的合并排序

时间:2019-02-11 21:00:40

标签: python linked-list mergesort

我目前正在练习或面试,并且正在对链接列表问题进行合并排序。

给出一个链表(具有nextval属性),4-2-1-3,我应该在1-2-3-4中将其排序为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)

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

1 个答案:

答案 0 :(得分:2)

当递归调用sortList时,局部函数变量R和L可能不再是其各自列表段的开头。然后,随后的合并操作将“跳过”排序列表中原始节点之前的部分,从而导致输出不完整。

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