题目
合并 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;    }
 | 
后记
尝试寻找更优解法。