题目描述
合并 k 个排序链表
解决方案
我的解题思路是基于合并两个有序链表。合并k个链表时,若每次创建新的节点,可能需要较大内存,因此对上次的代码进行了改进,每次将现有的节点串起来,不再创建新节点。
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
| struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == NULL) return l2; else if (l2 == NULL) return l1; ListNode *t1, *t2, *tmp; int n = l1->val, m = l2->val; if (n > m) { tmp = l1; l1 = l2; l2 = tmp; } t1 = l1; t2 = l2; while (t1&&t2) { ListNode *tmp1, *tmp2; n = t1->val, m = t2->val; if (n > m) while (t2->next&&t2->next->val <= n) t2 = t2->next; else if(n<m) while (t1->next&&t1->next->val <= m) t1 = t1->next; tmp1 = t1->next; t1->next = t2; t1 = t2; tmp2 = t2->next; if (t1 != NULL) t2->next = tmp1; else return l1; t2 = tmp2; } if (t2) t1 = t2; return l1; } ListNode* mergeKLists(vector<ListNode*>& lists) { int num = lists.size(); if (num == 0) return NULL; else if (num == 1) return lists[0]; ListNode* res = lists[0]; for (size_t i = 1; i < num; i++) { res = mergeTwoLists(res, lists[i]); } return res; }
|