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函数 实现递归

下为教程链接

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. 排序链表的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等148排序链表中等

leetcode148 排序链表(Medium)

LeetCode Algorithm 148. 排序链表

LeetCode 148. 排序链表

LeetCode Java刷题笔记—148. 排序链表

[LeetCode]148. Sort List链表归并排序