排序链表

2021-01-14 00:13

阅读:527

标签:pytho   tps   val   ems   temp   www   复杂   span   快慢指针   

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 

排序链表

标签:pytho   tps   val   ems   temp   www   复杂   span   快慢指针   

原文地址:https://www.cnblogs.com/gongyanzh/p/12943862.html


评论


亲,登录后才可以留言!