題目:題目連接數據結構
題意:給出k個有序鏈表,返回一個合併後的有序鏈表。ide
思路:顯而易見,每次遍歷這個k個鏈表的表頭,哪一個最小就加入答案鏈表便可獲得正確結果,可是這樣作複雜度是爆炸的,對k個鏈表表頭遍歷一遍智能解決一個結點的排序問題,效率低下。spa
咱們能夠想到數據結構課程上學到的兩個有序鏈表合併的問題,只須要O(n)的複雜度便可完成,且空間開銷極小,只須要一個記錄答案的頭結點便可,那麼這個問題能不能轉化成簡單的兩個有序鏈表合併的問題呢,答案是能夠的,參考歸併排序,咱們用二分的思想能夠輕易的解決這一問題。code
兩天用空閒時間作了三道leetcode的hard難度的題目,感受leetcode上的題有點偏簡單,但是又不想熬夜去打codeforces,應該怎麼抉擇呢,重操舊業作uva和codeforces仍是繼續作leetcode,好糾結啊blog
ac代碼:排序
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 return divideLists(lists, 0, lists.size() - 1); 13 } 14 15 16 ListNode* divideLists(vector<ListNode*>& lists, int st, int ed) { 17 if(st == ed) return lists[st]; 18 if(st > ed) return NULL; 19 20 ListNode* l = divideLists(lists, st, (st + ed) / 2); 21 ListNode* r = divideLists(lists, (st + ed) / 2 + 1, ed); 22 23 ListNode ans(0); 24 ListNode *tmp = &ans; 25 while(l && r) { 26 if(l->val < r->val) { 27 tmp->next = l; 28 l = l->next; 29 } 30 else { 31 tmp->next = r; 32 r = r->next; 33 } 34 tmp = tmp->next; 35 } 36 37 if(l) tmp->next = l; 38 else tmp->next = r; 39 40 41 return ans.next; 42 43 } 44 };