• Leetcode 23. Merge k Sorted Lists


    23. Merge k Sorted Lists

    • Total Accepted: 92690
    • Total Submissions:385821
    • Difficulty: Hard

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

    思路:

    可以先做21. Merge Two Sorted Lists

    方法一:直接按定义做,复杂度和下面的方法差不多。

    方法二:每次递归归并lists中前2条列表,直到归并只剩1条列表。

    方法三:首尾归并,每次归并后,lists规模减少一半。

    注意,局部函数中的变量一般要先初始化!

    代码:

    方法一:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9  class Solution {
    10 public:
    11     ListNode* mergeKLists(vector<ListNode*>& lists) {
    12         ListNode* head=new ListNode(-1);
    13         ListNode* end=head;
    14         int i,num=0,k=lists.size();
    15         long long minnum=-1;
    16         while(minnum!=LONG_MAX){
    17             minnum=LONG_MAX;
    18             for(i=0;i<k;i++){
    19                 if(!lists[i]) continue;
    20                 if(minnum>lists[i]->val){
    21                     minnum=lists[i]->val;
    22                 }
    23             }
    24             for(i=0;i<k;i++){
    25                 if(lists[i]&&minnum==lists[i]->val){
    26                     end->next=new ListNode(minnum);
    27                     end=end->next;
    28                     lists[i]=lists[i]->next;
    29                 }
    30             }
    31         }
    32         return head->next;
    33     }
    34 };

    方法二:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* mergeTwoLists(ListNode* a,ListNode* b){
    12         if(!a){
    13             return b;
    14         }
    15         if(!b){
    16             return a;
    17         }
    18         if(a->val>b->val){
    19             b->next=mergeTwoLists(a,b->next);
    20             return b;
    21         }
    22         a->next=mergeTwoLists(a->next,b);
    23         return a;
    24     }
    25     ListNode* mergeKLists(vector<ListNode*>& lists) {
    26         ListNode* head=NULL;//一定要初始化!!
    27         while(lists.size()>1){
    28             lists.push_back(mergeTwoLists(lists[0],lists[1]));
    29             lists.erase(lists.begin());
    30             lists.erase(lists.begin());
    31         }
    32         if(lists.size()){
    33             head=lists[0];
    34         }
    35         return head;
    36     }
    37 };

    方法三:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9  class Solution {
    10 public:
    11     ListNode* mergeTwoLists(ListNode* a,ListNode* b){
    12         if(!a){
    13             return b;
    14         }
    15         if(!b){
    16             return a;
    17         }
    18         if(a->val>b->val){
    19             b->next=mergeTwoLists(a,b->next);
    20             return b;
    21         }
    22         a->next=mergeTwoLists(a->next,b);
    23         return a;
    24     }
    25     ListNode* mergeKLists(vector<ListNode*>& lists) {
    26         if(lists.empty()){
    27             return NULL;
    28         }
    29         int len=lists.size();
    30         int b=0,e=len-1;
    31         while(b<e){
    32             while(b<e){
    33                lists[b]=mergeTwoLists(lists[b],lists[e]);
    34                b++;
    35                e--;
    36             }
    37             b=0;
    38         }
    39         return lists[0];
    40     }
    41 };

    或者

     1 class Solution {
     2 public:
     3     ListNode* mergeTwoLists(ListNode* a,ListNode* b){
     4         if(!a){
     5             return b;
     6         }
     7         if(!b){
     8             return a;
     9         }
    10         if(a->val>b->val){
    11             b->next=mergeTwoLists(a,b->next);
    12             return b;
    13         }
    14         a->next=mergeTwoLists(a->next,b);
    15         return a;
    16     }
    17     ListNode* mergeKLists(vector<ListNode*>& lists) {
    18         vector<ListNode*> res;
    19         int i;
    20         for(i=0;i<lists.size();i++){
    21             if(lists[i]){
    22                 res.push_back(lists[i]);
    23             }
    24         }
    25         if(!res.size()){
    26             return NULL;
    27         }
    28         int len=res.size();
    29         while(len>1){
    30             //设len=2q或者2q+1
    31             for(i=0;i<len/2;i++){//注意区分len是奇数还是偶数的情况
    32                 res[i]=mergeTwoLists(res[i],res[len-1-i]);
    33             }
    34             //此时len应该等于q(len为偶数)或者q+1(len为奇数)
    35             len=(len+1)/2;
    36         }
    37         return res[0];
    38     }
    39 };
  • 相关阅读:
    CoreLocation
    通知(NSNotificationCenter)
    加载xib文件
    UITextField
    UIButton
    UILabel
    UIAlertController
    layoutSubviews
    Java AQS详解(转)
    Java中synchronized
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5658884.html
Copyright © 2020-2023  润新知