Merge Sort
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//Merge two sorted lists
ListNode *mergeList(ListNode *a, ListNode *b) {
ListNode *pa = a;
ListNode *pb = b;
ListNode *head = new ListNode(-1);
ListNode *prev = head;
while(pa!=NULL && pb!=NULL) {
if(pa->val<pb->val) {
prev->next = pa;
pa=pa->next;
}
else {
prev->next = pb;
pb=pb->next;
}
prev = prev->next; //!!
}
if(pa!=NULL) prev->next = pa;
else if(pb!=NULL) prev->next = pb;
return head->next;
}
// Divide and sort
ListNode *mergeSort(ListNode *head, int n) {
if(n==0 || n==1) return head;
ListNode *mid=head;
for(int i=0;i<n/2-1;i++)
mid = mid->next;
ListNode *tmp=mid; //Find the element before the middle element
mid = mid->next;
tmp->next = NULL; //Set left list's tail
ListNode *left = mergeSort(head,n/2);
ListNode *right;
if(n%2==0)
right = mergeSort(mid,n/2);
else
right = mergeSort(mid,n/2+1);
return mergeList(left,right);
}
ListNode *sortList(ListNode *head) {
int cnt = 0;
ListNode *p = head;
while(p!=NULL) {
cnt++;
p=p->next;
}
return mergeSort(head,cnt);
}
};