对单链表的排序(LeetCode-148)

1、题目描述

    给定一个单链表,对这个单链表进行排序,要求时间复杂度O(nlogn),空间复杂度O(1)。

2、解题思路

    由于排序的要求是时间复杂度为O(NlogN),因此只能选择快速排序、归并排序、堆排序。如果待排序的序列是数组保存,那么快排空间复杂度最坏为O(N),平均为O(logN),归并排序空间复杂度为O(N),堆排序的空间复杂度为O(1)。如果待排序的序列是链表保存,那么不能对链表进行随机访问,因此不能采用堆排序,只能采用快排和归并。采用快排时,空间复杂度有时会退化为O(N),而采用归并排序时,由于合并两个有序链表不需要额外空间,因此归并排序的空间复杂度固定为O(logN),因此最好的方法是采用归并排序。归并的思想如下:

  • 找到链表的中间节点,并将链表拆为两个链表;
  • 递归地归并左边的链表,递归归并右边的链表;
  • 将左边的链表和右边的链表连接起来。

代码如下:

   ListNode* sortList(ListNode* head) {
        if(head==nullptr)
            return nullptr;
        if(head->next==nullptr)
            return head;
        ListNode *slow = head;                  /
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值