148. Sort List
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
题目链接:https://leetcode.com/problems/sort-list/
思路
主要从时间复杂度入手,且要求链表实现。
分析一下排序算法的特点(参见这篇文章),合适的的有归并排序和快排。
法一:归并排序
/**
* 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==NULL || head->next==NULL) return head;
ListNode *t1 = head, *t2 = head;
while(t2!=NULL && t2->next != NULL){
t2 = t2->next->next;
if(t2==NULL) break;
t1 = t1->next;
}
t2 = t1->next;
t1->next = NULL;
ListNode* l1 = sortList(head);
ListNode* l2 = sortList(t2);
return merge(l1, l2);
}
ListNode* merge(ListNode* l1, ListNode* l2){
if(l1==NULL) return l2;
if(l2==NULL) return l1;
ListNode* node = new ListNode(0);
ListNode *tail = node;
while(l1!=NULL && l2!=NULL){
if(l1->val <= l2->val){
tail->next = l1;
l1 = l1->next;
}else{
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
tail->next = NULL;
}
if(l1!=NULL){
tail->next = l1;
}
if(l2!=NULL){
tail->next = l2;
}
return node->next;
}
};
法二:快排
/**
* 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==NULL || head->next==NULL) return head;
sort(head, NULL);
return head;
}
void sort(ListNode* head, ListNode* end){
if(head==end || head->next == end) return;
int key = head->val;
ListNode *p = head, *q = head->next;
bool isok = true;
while(q!=end){
if(q->val < key){
p = p->next;
swap(p->val, q->val);
}
q = q->next;
}
swap(p->val, head->val);
sort(head, p);
sort(p->next, end);
}
void swap(int &p, int &q){
int tmp = q;
q = p;
p = tmp;
}
};