LeetCode-23. 合併K個排序連結串列
阿新 • • 發佈:2018-12-13
題目地址: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; } };