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函数 实现递归
下为教程链接
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
解读:
若其中一个链表已空,则返回另一链表的剩下全部序列