合並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 }
