链表排序
问题:我们需要将一个无序的单链表在 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-