代码之家  ›  专栏  ›  技术社区  ›  Dawn17

在链接列表中合并排序

  •  0
  • Dawn17  · 技术社区  · 6 年前

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

    给出了一个链接列表(has next val 属性) 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 .

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

    请帮忙。

    编辑

    我通过改变来解决这个问题 L R l1 l2 改变

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

    这到

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

    其他部分是相同的,现在我有了相同的答案。但是,我不确定这一变化是如何产生影响的。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alain T.    6 年前

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

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