http://www.geeksforgeeks.org/merge-sort-for-linked-list/
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <queue> 5 #include <stack> 6 #include <string> 7 #include <fstream> 8 #include <map> 9 #include <set> 10 using namespace std; 11 12 struct node { 13 int data; 14 node *next; 15 node() : data(0), next(NULL) { } 16 node(int d) : data(d), next(NULL) { } 17 }; 18 19 void push(node* &head, int k) { 20 node *new_node = new node(k); 21 new_node->next = head; 22 head = new_node; 23 } 24 25 void print(node* head) { 26 if (!head) return; 27 cout << head->data << " "; 28 print(head->next); 29 } 30 31 void frontbacksplit(node *head, node *&a, node *&b) { 32 node *p, *q; 33 if (!head || !head->next) { 34 a = head; 35 b = NULL; 36 return; 37 } 38 p = head; 39 q = head->next; 40 while (q) { 41 q = q->next; 42 if (q) { 43 q = q->next; 44 p = p->next; 45 } 46 } 47 a = head; 48 b = p->next; 49 p->next = NULL; 50 } 51 52 node *sortmerge(node *a, node *b) { 53 node *ans = NULL; 54 if (!a) return b; 55 if (!b) return a; 56 if (a->data < b->data) { 57 ans = a; 58 ans->next = sortmerge(a->next, b); 59 } 60 else { 61 ans = b; 62 ans->next = sortmerge(a, b->next); 63 } 64 return ans; 65 } 66 67 void mergesort(node *&head) { 68 if (!head || !head->next) return; 69 node *a, *b; 70 node *h = head; 71 frontbacksplit(h, a, b); 72 mergesort(a); 73 mergesort(b); 74 head = sortmerge(a, b); 75 } 76 77 int main() { 78 node *head = NULL; 79 push(head, 15); 80 push(head, 10); 81 push(head, 5); 82 push(head, 20); 83 push(head, 3); 84 push(head, 2); 85 mergesort(head); 86 print(head); 87 return 0; 88 }