题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析
- 如果理由
最后选择
进行合并链表,这是时间复杂度是kn
如果 k
很大的时候时间复杂度简直爆炸,还不如直接合并。
- 如果使用归并排序 时间复杂度是
nlogk
。
- 如果直接两两暴力合并,时间复杂度是
n(k^2+k)/2
- 所以当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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) { struct ListNode* l3 = NULL; struct ListNode* p = NULL; struct ListNode* tmp = NULL; if(!l1 && !l2) { return l3; } if(l1 && !l2) { return l1; } if(!l1 && l2) { return l2; } if(l1->val < l2->val) { l3 = l1; l1 = l1->next; } else { l3 = l2; l2 = l2->next; } p = l3; while(l1 && l2) { if(l1->val < l2->val) { tmp = l1->next; p->next = l1; l1 = tmp; } else { tmp = l2->next; p->next = l2; l2 = tmp; } p = p->next; } if(l1) { p->next = l1; } if(l2) { p->next = l2; } return l3; } * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { if(listsSize == 0) { return 0; } if(listsSize == 1) { return (*lists); } struct ListNode* ret = (*lists); for(int i = 1 ; i < listsSize; i++) { lists++; ret = merge((*lists), ret); } return ret; }
|
后记
尝试寻找更优解法。