Advertisement
Guest User

merge_sort_list

a guest
Jan 23rd, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct node {
  6.     int val;
  7.     node * nxt;
  8.     node(int v = 0) {
  9.         val = v;
  10.         nxt = nullptr;
  11.     }
  12. };
  13.  
  14. void print(node * root) {
  15.     node * p = root;
  16.     while (p != nullptr) {
  17.         cout << p->val << " ";
  18.         p = p->nxt;
  19.     }
  20.     cout << "\n";
  21. }
  22.  
  23. void add(node * &root, node * &last, node * &p) {
  24.     if (root == nullptr) {
  25.         root = p;
  26.         last = p;
  27.         return;
  28.     }
  29.     else {
  30.         last->nxt = p;
  31.         last = p;
  32.     }
  33. }
  34.  
  35. void msort(node * &root, node * &last, int sz) {
  36.     if (sz <= 1) {
  37.         return;
  38.     }
  39.     node * L = nullptr;
  40.     node * R = nullptr;
  41.  
  42.     node * L1 = nullptr;
  43.     node * R1 = nullptr;
  44.  
  45.     int cnt = 0, L_sz = 0, R_sz = 0;
  46.     node * p = root;
  47.     while (p != nullptr) {
  48.         node * q = p;
  49.         p = p->nxt;
  50.  
  51.         ++cnt;
  52.         if (cnt <= sz / 2) {
  53.             q->nxt = L;
  54.             L = q;
  55.             if (L->nxt == nullptr) {
  56.                 L1 = L;
  57.             }
  58.             ++L_sz;
  59.         }
  60.         else {
  61.             q->nxt = R;
  62.             R = q;
  63.             if (R->nxt == nullptr) {
  64.                 R1 = R;
  65.             }
  66.             ++R_sz;
  67.         }
  68.     }
  69.  
  70.     msort(L, L1, L_sz);
  71.     msort(R, R1, R_sz);
  72.  
  73.     node * l = L;
  74.     node * r = R;
  75.     node * ans = nullptr;
  76.     node * last1 = nullptr;
  77.  
  78.     while (l != nullptr && r != nullptr) {
  79.         if (l->val == r->val) {
  80.             node * l1 = l;
  81.             node * r1 = r;
  82.  
  83.             l = l->nxt;
  84.             r = r->nxt;
  85.  
  86.             l1->nxt = nullptr;
  87.             r1->nxt = nullptr;
  88.  
  89.             add(ans, last1, l1);
  90.             add(ans, last1, r1);
  91.         }
  92.         else if (l->val < r->val) {
  93.             node * l1 = l;
  94.             l = l->nxt;
  95.             l1->nxt = nullptr;
  96.             add(ans, last1, l1);
  97.         }
  98.         else {
  99.             node * r1 = r;
  100.             r = r->nxt;
  101.             r1->nxt = nullptr;
  102.             add(ans, last1, r1);
  103.         }
  104.     }
  105.  
  106.     while (l != nullptr) {
  107.         node * l1 = l;
  108.         l = l->nxt;
  109.         l1->nxt = nullptr;
  110.         add(ans, last1, l1);
  111.     }
  112.  
  113.     while (r != nullptr) {
  114.         node * r1 = r;
  115.         r = r->nxt;
  116.         r1->nxt = nullptr;
  117.         add(ans, last1, r1);
  118.     }
  119.     root = ans;
  120.     last = last1;
  121. }
  122.  
  123. int main() {
  124.     node * root = nullptr;
  125.     node * last = nullptr;
  126.     int n;
  127.     cin >> n;
  128.  
  129.     for (int i = 0; i < n; ++i) {
  130.         int x;
  131.         cin >> x;
  132.  
  133.         node * p = new node(x);
  134.         add(root, last, p);
  135.     }
  136.     msort(root, last, n);
  137.     print(root);
  138.  
  139.     return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement