如果我通过slow.next而不是mid,为什么mergesort不起作用?

问题描述

在这段用于mergesort的代码中,为什么您可以在对sortList的递归调用中直接传递中点而不是slow.next?在第13行中,传递mid = slow.next与直接传递slow.next有何不同?

class Solution:
    def sortList(self,head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        fast = head.next
        slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        mid = slow.next
        slow.next = None
        l = self.sortList(head)
        r = self.sortList(slow.next)##instead pass mid here,and it works.
        return self.merge(l,r)
    
    def merge(self,l,r):
        if not l or not r:
            return l or r
        if l.val > r.val:
            l,r = r,l
        # get the return node "head"
        head = pre = l
        l = l.next
        while l and r:
            if l.val < r.val:
                l = l.next
            else:
                nxt = pre.next
                pre.next = r
                tmp = r.next
                r.next = nxt
                r = tmp
            pre = pre.next
        # l and r at least one is None
        pre.next = l or r
        return head

解决方法

您首先将slow.next分配给mid,所以mid现在位于列表第二部分的开头。然后,您将None分配给slow.next,因此,如果现在调用self.sortList(slow.next),则列表的第二部分将不被排序。

如果调用self.sortList(mid),则由于mid是指向列表第二部分的指针,因此mergesort起作用。