原题链接:排序链表
个人解法
思路:
借助数组,讲链表结点存入数组中再进行排序后取出
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn), 空间复杂度: O ( n ) O(n) O(n)
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
vector<pair<int, ListNode*>> v;
ListNode *p = head;
while(p) {
v.push_back({p->val, p});
p = p->next;
}
sort(v.begin(), v.end());
ListNode *pre_head = new ListNode();
p = pre_head;
for(auto &t : v) {
p->next = t.second;
p = p->next;
p->next = nullptr;
}
return pre_head->next;
}
};
更好的解法
思路:
归并排序,因为是链表的形式,故归并的时候只需要按顺序链上即可,此时空间复杂度为常数
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn), 空间复杂度: O ( 1 ) O(1) O(1)
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode *mergesort(ListNode *start, ListNode *end) {
if(start->next == end) {
start->next = nullptr;
return start;
}
ListNode *p = start, *q = start;
while(q != end && q->next != end) {
p = p->next;
q = q->next->next;
}
ListNode *left = mergesort(start, p);
ListNode *right = mergesort(p, end);
ListNode *pre_head = new ListNode();
ListNode *t = pre_head;
while(left && right) {
if(left->val < right->val) {
t->next = left;
left = left->next;
}else {
t->next = right;
right = right->next;
}
t = t->next;
t->next = nullptr;
}
while(left) {
t->next = left;
left = left->next;
t = t->next;
t->next = nullptr;
}
while(right) {
t->next = right;
right = right->next;
t = t->next;
t->next = nullptr;
}
ListNode *res = pre_head->next;
delete(pre_head);
return res;
}
ListNode* sortList(ListNode* head) {
if(head == nullptr) return nullptr;
head = mergesort(head, nullptr);
return head;
}
};