148. 排序链表

8.11更新 快速排序看起来更易懂,而且更好操作

题解来自 https://leetcode-cn.com/problems/sort-list/solution/python-by-scut_dell/

技巧:

  1. 设置None,是的链表Node有变量可指,用这种方法存储了链表

    Big = None

    if cur.val>head.val: 

      t.next = Big

      Big = t

  2. 合并的时候 用两个变量指向同一个节点

    res = ListNode(None)

    cur = res

  3. 同一个函数里同时 分和合,使用递归。

    a) 前半部分遍历链表,分成三部分

    b) 递归分割合并big,small

    c) 遍历 small equal big 合并

 

 ——————————————————————————————————————————————————————————————————————————

仔细看了下,答案中采用了 递归的归并排序方法:

1. Cut步骤: 在顶层将完整的ListNode分成两半, basecase 是 head is None or head.next is None

2.Merge步骤: 将分割完后的 Node1 Node2 调用合并函数,返回值是 合并好的头节点

注意点: 在Cut函数里,在已经分割了head1 head2 后 重复调用cut函数 实现递归

下为教程链接

https://leetcode-cn.com/problems/sort-list/solution/zi-di-xiang-shang-de-gui-bing-pai-xu-java-dai-ma-b/

1.Cut递归:def sort(self,head):

顶层:

slow = head

fast = head

while fast.next and fast.next.next:

  fast = fast.next.next

  slow = slow.next

head2 = slow.next

slow.next = None

leftListnode = self.sort(head)

rightListnode = self.sort(head2)

return merge(leftListnode,rightListnode)

解析:

    顶层要解决 切分并找到两个头节点 head head2 并通过递归返回 已经sort的 左右两链表的头节点 leftListnode 和 rightListnode

    然后再把两个sorted好的 头节点 再merge一遍 最后返回 头节点

底层:

if head is None or head.next is None:

  return head

解析:

    本来最后就是要得到 sort好了的链表的头节点,所以当遇到None的时候,直接return head

    

2. Merge 递归:def merger(left,right):

顶层:

if left.val < right.val:

  left.next = mergeList(left.next,right)

  return left

else:

  right.next = mergeList(right.next,left)

  return right

              

  解读:

    最后要得到的肯定是头节点,所以要返回最小值的头节点

    然后递归的得到最小的节点,由next拼凑在一起

底层:

   if left is None :

    return right

   if right is None:

    return left

  解读:

    若其中一个链表已空,则返回另一链表的剩下全部序列

原文地址:https://www.cnblogs.com/ChevisZhang/p/12233352.html