1. 程式人生 > 實用技巧 >js的封裝、繼承與多型

js的封裝、繼承與多型

合併k個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。

示例:

輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/merge-k-sorted-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 10 /*class Solution { 11 public: 12 //法1 使用優先佇列 小頂堆 13 //有k個待排序的連結串列 每次將未合併完的連結串列的頭結點 放入優先佇列 14 //然後再從優先佇列中取出最小的 以尾插法放到res中 15 //最多操作kn次 每次從優先佇列存入取出複雜度為logk 16 //總時間複雜度為 o(knlogk) 空間o(k) 17 struct Cell
18 { 19 ListNode* node; 20 Cell(ListNode* _node):node(_node){}; 21 bool operator <(const Cell& c)const 22 { 23 return node->val>c.node->val; 24 } 25 }; 26 ListNode* mergeKLists(vector<ListNode*>& lists) { 27 28
priority_queue<Cell> pq; 29 for(auto list:lists) 30 if(list) 31 pq.push(list); 32 ListNode* dummy=new ListNode(0),*tail=dummy; 33 while(!pq.empty()) 34 { 35 ListNode* temp=pq.top().node; 36 pq.pop(); 37 if(temp->next) 38 pq.push(temp->next); 39 tail->next=temp; 40 tail=temp; 41 } 42 return dummy->next; 43 } 44 };*/ 45 46 class Solution { 47 public: 48 //法2 分治合併 時o(knlogk) 空o(logk) 49 ListNode* merge2Lists(ListNode* a,ListNode* b) 50 { 51 ListNode dummy,*tail=&dummy,*pa=a,*pb=b; 52 //ListNode *dummy=new ListNode(); 53 //頭節點使用ListNode型別不用ListNode* new 這樣更省記憶體 54 while(pa&&pb) 55 { 56 if(pa->val<pb->val) 57 { 58 tail->next=pa; 59 pa=pa->next; 60 } 61 else 62 { 63 tail->next=pb; 64 pb=pb->next; 65 } 66 tail=tail->next; 67 } 68 tail->next=pa?pa:pb; 69 return dummy.next; 70 } 71 ListNode* merge(vector<ListNode*> &lists,int l,int r) 72 { 73 if(l==r)return lists[l]; 74 else if(l>r)return NULL; 75 int mid=(l+r)>>1; 76 return merge2Lists(merge(lists,l,mid),merge(lists,mid+1,r)); 77 } 78 ListNode* mergeKLists(vector<ListNode*>& lists) { 79 return merge(lists,0,lists.size()-1); 80 } 81 };