Sort a linked list in O(n log n) time using constant space complexity.
思路:分治法排序链表,这个。。背一下吧
代码:
/**
* 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 *p = head;
ListNode *q = head->next;
while(q!=NULL && q->next!=NULL){
p = p->next;
q = q->next->next;
}
ListNode *right = sortList(p->next);
p->next = NULL;//把链表从中间截断
ListNode *left = sortList(head);
//上面递归调用,到这里的时候左右链表都只剩一个值
return merge(left,right);
}
ListNode *merge(ListNode *left,ListNode *right){
ListNode dummy(0);
ListNode *tmp = &dummy;
while(left && right){
if(left->val < right->val){
tmp->next = left;
left = left->next;
}
else{
tmp->next = right;
right = right->next;
}
tmp = tmp->next;
}
if(left!=NULL)
tmp->next = left;
if(right!=NULL)
tmp->next = right;
return dummy.next;
}
};