148. 排序链表

7 篇文章 0 订阅
4 篇文章 0 订阅

题目:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
本题的重点在于,时间复杂度和空间复杂度的限制

题解:
链表的优势在于可以通过修改引用来更改节点顺序,无需开辟额外空间,而已循环交换。
题解采用了归并排序的方法,通过不断二分排序再合并的方法,实现了O(nlogn)的时间复杂度和O(1)的空间复杂度
下图来自LeetCode网站题解:
链接:https://leetcode-cn.com/problems/sort-list/solution/sort-list-gui-bing-pai-xu-lian-biao-by-jyd/
在这里插入图片描述
参照这个思想,代码实现如下:

#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time   : 2019/10/30 16:06
# @Author : Grey

# 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
        fast, slow = head.next, head
        while fast.next and slow:
            fast, slow = fast.next.next, slow.next
        fast = slow.next
        slow.next = None
        slow = head
        left, right = self.sortList(self, slow), self.sortList(self, fast)
        res = h = ListNode(0)
        while left and right:
            if left.val <= right.val:
                h.next = left
                left = left.next
            else:
                h.next = right
                right = right.next
            h = h.next
        h = left if left else right
        res = res.next
        return res
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值