排序链表

Posted gongyanzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序链表相关的知识,希望对你有一定的参考价值。

148. 排序链表

难度 ??

O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

思路

(O(nlogn))时间复杂度,分而治之,使用归并排序,数组归并排序代码可以看这里

  • 分割(找到中间节点,使用快慢指针)
  • 合并

coding

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        #递归退出条件
        if not head or not head.next:
            return head
        #找到中间节点
        mid = self.divide(head)
        temp = mid.next
        mid.next = None
        #递归 合并
        l = self.sortList(head)
        r = self.sortList(temp)
        return self.merge(l,r)
        
    def divide(self,head):
        #找到链表中间节点
        if not head or not head.next:
            return head
        slow,fast = head,head.next.next
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow
    
    def merge(self,left,right):
        #合并链表
        new = ListNode(0)
        curr = new
        while left and right:
            if left.val <= right.val:
                curr.next = left
                left = left.next
            else:
                curr.next = right
                right = right.next
            curr = curr.next
            
        if left:
            curr.next = left 
        if right:
            curr.next = right
        
        return new.next

以上是关于排序链表的主要内容,如果未能解决你的问题,请参考以下文章

常见的链表排序(Java版)

代码的鲁棒性:合并两个排序的链表

代码模板实现双向链表的去重拼接合并排序

25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)

链表归并排序

链表归并排序