leetcode23。合并K个排序链表

  

合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。   示例:   输入:   (   1→4→5   1→3→4   2→6   ]   输出:1→1→2→3→4→4→5→6   力扣(LeetCode)   链接:https://leetcode-cn.com/problems/merge-k-sorted-lists      

/*   解题思路:   解法一,顺序合并   1、列表[0][1]与列表合并,结果与列表[2]合并……结果与列表(listsSize-1)合并   解法二,分治合并   1、列表[0][1]与列表合,并列表[2][3]合与列表并,然后将合并的结果继续合并。   */   

  
解法二,分治合并   
   leetcode23。合并K个排序链表   

/*   标题:leetcode23。合并K个排序链表   作者:xidoublestar   方法:顺序合并   类型:C   日期:2020-5-27   */struct ListNode * mergeTwoLists (struct ListNode * l1, l2 struct ListNode *) {   如果l1 (!)   返回l2;   如果l2 (!)   返回l1;   struct ListNode *头=(struct ListNode *) malloc (sizeof (struct ListNode)) *尾=头;   而(l1,,l2) {   如果(l1→val & lt;l2→val) {   尾巴→下=l1;   l1=l1→下;   }   其他{   尾巴→下=l2;   l2=l2→下;   }   尾=尾→下;   }   如果尾巴(l1)→下一个=l1;   else if (l2)尾部→下=l2;   尾=头;   头=头→下;   免费(尾);   返回头;   }   struct ListNode * mergeKLists (struct ListNode * *列表,int listsSize) {   如果(listsSize==0)   返回NULL;   struct ListNode * res=*列表;   for (int i=1;我& lt;listsSize;我+ +)   {   如果(列表[我]!=NULL)   res=mergeTwoLists (res、列表[我]);   }   返回res;   }      

/*   标题:leetcode23。合并K个排序链表   作者:xidoublestar   方法:顺序合并   类型:C   日期:2020-5-27   */struct ListNode * mergeTwoLists (struct ListNode * l1, l2 struct ListNode *) {   如果(l1 (!) | | (l2))返回l1吗?l1, l2;   struct ListNode头;   头。下一个=零;   struct ListNode *尾=,头;   而(l1,,l2) {   如果(l1→val & lt;l2→val) {   尾巴→下=l1;   l1=l1→下;   }   其他{   尾巴→下=l2;   l2=l2→下;   }   尾=尾→下;   }   下=l1尾巴→吗?l1, l2;   返回head.next;   }   struct ListNode *合并(struct ListNode * *列表,int, int) {   如果(左==)   返回列表(左);   如果(左比;右)   返回NULL;   int中期=(左+右)在祝辞1;   struct ListNode * p1=合并(列表,左,中期);   struct ListNode * p2=合并(列表、中期+ 1右);   返回mergeTwoLists (p1, p2);   }   struct ListNode * mergeKLists (struct ListNode * *列表,int listsSize) {   如果(listsSize==0)   返回NULL;   返回合并(列表、0 listsSize - 1);   }      

leetcode23。合并K个排序链表