LeetCode23. Merge k Sorted Lists

  題目:題目連接數據結構

  題意:給出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 };
相關文章
相關標籤/搜索