[数据结构]——链表排序

链表排序

问题:我们需要将一个无序的单链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序

时间复杂度为稳定O(n log n)的排序只有堆排序与归并排序,但是堆排序需要建堆,那么链表有n个节点我们就需要开辟长度为n的数组来存放节点,所以我们选择归并排序,我们知道普通的归并排序需要开辟一个tmp数组来存放临时数据,但是因为我们这里对链表进行排序不需要临时数组,所以我们使用的空间为常数个。

排序思路

1.归并排序是二分的思想,所以我们需要递归的进行对链表进行分割
2.二分二分的分割链表需要找到中间的节点,所以我们使用快慢指针法
3.直到将链表分割成以节点为单位时,将所有的链表进行合并

在这里插入图片描述

源码刨析

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
   
public:
    ListNode* sortList(ListNode* head) {
   
        if(head == nullptr|| head->next == nullptr) return head;
        ListNode* fast = head-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值