题目描述
列表排序,时间复杂度 O(nlogn)。
解题思路
看到列表排序和时间复杂度,直接归并。
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类 the head node
* @return ListNode类
*/
ListNode* sortInList(ListNode* head) {
// write code here
int l = 0;
ListNode *tmp = head;
while(tmp)
{
l++;
tmp = tmp->next;
}
if(l == 1)
return head;
tmp = head;
for(int i = 0; i < l / 2 - 1; i++)
{
tmp = tmp->next;
}
ListNode* start = tmp->next;
tmp->next = NULL;
ListNode* p1 = sortInList(head);
ListNode* p2 = sortInList(start);
ListNode* res = merge(p1, p2);
return res;
}
ListNode* merge(ListNode* p1, ListNode* p2)
{
if(!p1 && !p2) return NULL;
if(!p1 && p2) return p2;
if(p1 && !p2) return p1;
ListNode* tmp = new ListNode(-1);
ListNode* res = nullptr;
if(p1->val < p2->val)
{
tmp->next = p1;
res = tmp;
p1 = p1->next;
}
else{
tmp->next = p2;
res = tmp;
p2 = p2->next;
}
tmp = tmp->next;
while(p1 && p2)
{
if(p1->val < p2->val){
tmp->next = p1;
p1 = p1->next;
}
else{
tmp->next = p2;
p2 = p2->next;
}
tmp = tmp->next;
}
if(p1) tmp->next = p1;
if(p2) tmp->next = p2;
return res->next;
}
};