码迷,mamicode.com
首页 > 编程语言 > 详细

148. 排序链表

时间:2020-01-25 20:44:18      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:and   教程   nod   hang   java   return   bin   case   一个   

又是链表,怎么又是链表,暴风哭泣了

一看到链表的题我就下意识先去看答案了,先吐槽一会再回去继续写。

 

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

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

 

  解读:

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

 

148. 排序链表

标签:and   教程   nod   hang   java   return   bin   case   一个   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!