1. 程式人生 > >LeetCode-23. 合併K個排序連結串列

LeetCode-23. 合併K個排序連結串列

題目地址:https://leetcode-cn.com/problems/merge-k-sorted-lists/
思路:歸併處理,兩兩合併,複雜度 O(log(k)*max(N)),N為連結串列長度

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode* s1,ListNode* s2){
        ListNode* head = new ListNode(0);
        ListNode* s = head;
        while(s1!=NULL && s2!=NULL){
            if(s1->val<s2->val){
                head->next = s1;
                s1 = s1->next;
                head = head->next;
            }else{
                head->next = s2;
                s2 = s2->next;
                head = head->next;
            }
        }
        while(s1!=NULL){
            head->next = s1;
            s1 = s1->next;
            head = head->next;
        }
         while(s2!=NULL){
            head->next = s2;
            s2 = s2->next;
            head = head->next;
        }
        return s->next;
    }
    
     ListNode* solve(vector<ListNode*>& lists,int l,int r){
         if(l>r){
             return NULL;
         }
         //cout<<l<<r<<endl;
         if(l==r){
             //cout<<lists[l]->val<<endl;
             return lists[l];
         }
         int k = r-l+1;
         int mid = k/2+l;
         ListNode* s1 = solve(lists,l,mid-1);
         ListNode* s2 = solve(lists,mid,r);
         return merge(s1,s2);
     }
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int k = lists.size();
        ListNode* s = solve(lists,0,k-1);
        return s;
    }
};