148. 排序链表_CodingPark编程公园

排序链表

问题

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

进阶
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

示例 1:在这里插入图片描述

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:
在这里插入图片描述

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

链接:https://leetcode-cn.com/problems/sort-list

解答

在这里插入图片描述

完成 进阶 要求 😁
归并排序 + 链表

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        
        '''
        分
        '''
        slow, fast = head, head.next
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        # 切割
        mid, slow.next = slow.next, None
        left = self.sortList(head)
        right = self.sortList(mid)
        '''
        合
        '''
        res = dot = ListNode(0)
        while left and right:
            if left.val>right.val:
                dot.next = right
                right = right.next
            else:
                dot.next = left
                left = left.next
            dot = dot.next
        if left:
            dot.next = left
        else:
            dot.next = right
        
        return res.next


在这里插入图片描述

一点点感悟

看下面这段代码
在这里插入图片描述

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def sortList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        
        '''
        分
        '''
        slow, fast = head, head.next
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        # 切割
        mid, slow.next = slow.next, None
        left = self.sortList(head)
        right = self.sortList(mid)
        '''
        合
        '''
        res = dot = ListNode(0)
        while left and right:
            if left.val>right.val:
                dot.next = ListNode(right.val)
                right = right.next
            else:
                dot.next = ListNode(left.val)
                left = left.next
            dot = dot.next
        if left:
            dot.next = left
        else:
            dot.next = right
        
        return res.next


在这里插入图片描述

可以看出 new 一个 ListNode 十分消耗时间 🙅

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TEAM-AG

编程公园:输出是最好的学习方式

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值