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; /