1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| ListNode* mergeTwoList(ListNode* p2a, ListNode* p2b) { ListNode dummy; ListNode* ptr = &dummy; while (p2a || p2b) { int a = p2a ? p2a->val : INT_MAX; int b = p2b ? p2b->val : INT_MAX; if (a < b) { ptr->next = p2a; p2a = p2a->next; } else { ptr->next = p2b; p2b = p2b->next; } ptr = ptr->next; } return dummy.next; }
ListNode* mergeSort(ListNode* head) { if (!head || !head->next) return head; int n = 0; ListNode* ptr = head; while (ptr) { ++n; ptr = ptr->next; } ListNode dummy; dummy.next = head; ptr = &dummy; ListNode* prev, *l, *r, *t, *next; for (int w = 1; w < n; w <<= 1) { prev = &dummy; l = dummy.next; r = nullptr; while (l) { t = l; for (int i = 1; i < w && t; ++i) t = t->next; r = nullptr; if (t) { r = t->next; t->next = nullptr; } t = r; for (int i = 1; i < w && t; ++i) t = t->next; next = nullptr; if (t) { next = t->next; t->next = nullptr; } ListNode* ret = mergeTwoList(l, r); prev->next = ret; while (prev->next) prev = prev->next; l = next; } } return dummy.next; }
|