LeetCode23. Merge k Sorted Lists
题目:题目链接
题意:给出k个有序链表,返回一个合并后的有序链表。
思路:显而易见,每次遍历这个k个链表的表头,哪个最小就加入答案链表即可得到正确结果,但是这样做复杂度是爆炸的,对k个链表表头遍历一遍智能解决一个结点的排序问题,效率低下。
我们可以想到数据结构课程上学到的两个有序链表合并的问题,只需要O(n)的复杂度即可完成,且空间开销极小,只需要一个记录答案的头结点即可,那么这个问题能不能转化成简单的两个有序链表合并的问题呢,答案是可以的,参考归并排序,我们用二分的思想可以轻易的解决这一问题。
两天用空闲时间做了三道leetcode的hard难度的题目,感觉leetcode上的题有点偏简单,可是又不想熬夜去打codeforces,应该怎么抉择呢,重操旧业做uva和codeforces还是继续做leetcode,好纠结啊
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 };
版权声明:该博客版权归本人所有,若有意转载,请与本人联系