如果没有要求空间复杂度为O(1),可以遍历链表并将每个节点的值存入vector中,利用sort( )对vector排序后,最后再遍历一次链表,将排序后的vector中的元素依次赋给链表的节点值。时间复杂度O(nlogn),空间复杂度O(n)。
考点:
1. 归并排序O(nlogn);2. 快慢指针定位链表中间节点。
复杂度分析:
T(n) 拆分 n/2, 归并 n/2 ,一共是n/2 + n/2 = n
/ \ 以下依此类推:
T(n/2) T(n/2) 一共是 n/2*2 = n
/ \ / \
T(n/4) ……….. 一共是 n/4*4 = n
一共有logn层,故复杂度是 O(nlogn)
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeSort(ListNode* left, ListNode* right) {