148. 排序链表
Posted cheviszhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了148. 排序链表相关的知识,希望对你有一定的参考价值。
又是链表,怎么又是链表,暴风哭泣了
一看到链表的题我就下意识先去看答案了,先吐槽一会再回去继续写。
仔细看了下,答案中采用了 递归的归并排序方法:
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
解读:
若其中一个链表已空,则返回另一链表的剩下全部序列
以上是关于148. 排序链表的主要内容,如果未能解决你的问题,请参考以下文章