合并K个排序链表(C语言)
合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
分析:首先,要判断数组为空的情况,如果数组为空直接返回空,如果只有一个链表,那个直接返回这个链表。
因为K的链表都是排序链表,所以先将第一个和第二个链表合并排序,然后将得到的排序链表再与第三个链表合并排序,一次类推,直到将最后一个链表合并排序为止。
下边是代码实现:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * struct ListNode *next; 6 * }; 7 */ 8 9 10 struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){ 11 if(listsSize==0){ 12 return NULL; 13 } 14 if(listsSize==1){ 15 return lists[0]; 16 } 17 struct ListNode *resultList = lists[0]; 18 for(int i=1;i<listsSize;i++){ 19 struct ListNode *listi = lists[i]; 20 if(resultList==NULL){ 21 resultList = listi; 22 continue; 23 } 24 if(listi==NULL){ 25 continue; 26 } 27 28 while(listi!=NULL){ 29 struct ListNode *list=resultList; 30 if(listi->val<=resultList->val){ 31 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 32 body->val=listi->val; 33 body->next=resultList; 34 resultList=body; 35 }else{ 36 if(list->next==NULL){ 37 list->next=listi; 38 break; 39 }else{ 40 while(list!=NULL&&list->next!=NULL){ 41 if(list->next->val>=listi->val){ 42 struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode)); 43 body->val=listi->val; 44 body->next=list->next; 45 list->next=body; 46 break; 47 } 48 list=list->next; 49 } 50 if(list->next==NULL){ 51 list->next=listi; 52 break; 53 } 54 } 55 56 } 57 listi=listi->next; 58 } 59 60 61 } 62 return resultList; 63 }
posted on 2019-09-06 14:35 lucky&girl 阅读(1064) 评论(0) 编辑 收藏 举报