leetcode-23-Merge k Sorted Lists
来源:互联网 发布:淘宝关键词竞争指数 编辑:程序博客网 时间:2024/05/29 03:35
题意:合并k个有序链表。
tags:divide and conquer。分治算法。
思路:divide and conquer分治算法;在合并2个链表的基础上分治算法解决。每次处理2个链表。举例来说,6个的话,第一次循环处理1-4,2-5,3-6返回3个有序链表123,第二次处理1-3保存为1返回12,最后处理1-2;5个的话,第一次处理1-4,2-5返回12加上原有的3,后面处理一样。所以每次二分的k的取值举个例子试一下就知道了。这里n=(n+1)/2。n最后一次取2完成最后一次处理故循环条件为n〉1。
测试通过时间神奇的在32ms。一般为400ms。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { int n = lists.size(); if(n==0) return NULL; while(n>1) { int k=(n+1)/2; for(int i =0;i<n/2;i++) //n的情况下只需要处理n/2个merge2Lists()。 { lists[i]=merge2Lists(lists[i],lists[i+k]); } n = k; // } return lists[0]; } ListNode* merge2Lists(ListNode* l1, ListNode* l2) { //合并2个有序链表 ListNode* p=new ListNode(0); ListNode* q=p; //q保存链表头部 while (l1 && l2) { if (l1->val >= l2->val) { p->next=l2; l2=l2->next; } else { p->next=l1; l1=l1->next; } p=p->next; //注意p指针也要后移 } if(l1) p->next=l1; if(l2) p->next=l2; return q->next; //从第二个node开始取,舍弃开始的0 }};
空间复杂度o(1),时间复杂度为
o(nklog2k)
因为每次n/2都要遍历所有的点,即nk。次数x=log2k。
如果是开始想的最笨的依次合并的话,即1-2何必,然后合并3,合并4…….。这种时间复杂度为:
总共遍历的节点数目为n(2+3+…+k) = n*(k^2+k-2)/2, 因此时间复杂度是O(n*(k^2+k-2)/2) = O(nk^2)
0 0
- LeetCode(23)Merge K Sorted Lists
- [leetcode 23] Merge k Sorted Lists
- [leetcode]23 Merge k Sorted Lists
- [#23 leetcode]Merge k Sorted Lists
- LeetCode 23 Merge k Sorted Lists
- leetcode 23 Merge k Sorted Lists
- [Leetcode 23, Hard] Merge k Sorted Lists
- Leetcode 23 Merge k Sorted Lists
- LeetCode 23 - Merge k Sorted Lists
- LeetCode 23: Merge K Sorted Lists
- leetcode-23Merge k Sorted Lists
- leetcode 23: Merge k Sorted Lists
- Leetcode 23 Merge k Sorted Lists
- LeetCode-23 Merge k Sorted Lists
- LeetCode 23: Merge k Sorted Lists
- leetcode 23:Merge k Sorted Lists
- Leetcode #23 Merge k Sorted Lists
- LeetCode(23)Merge k Sorted Lists
- 数组实现约瑟夫环
- C++回车换行时停止读入
- iOS之XMPP环境搭建
- 如何用js得到当前页面的url信息方法(JS获取当前网址信息)
- hdu——1010Tempter of the Bone
- leetcode-23-Merge k Sorted Lists
- 建造者设计模式
- ORACLE报错
- PyCharm使用(二)
- Andriod Checkbox
- 使用js实现上移、下移、置顶、置底功能及源码案例
- HDU 4391 Paint The Wall
- 【c++】第十二周上机实践作业 项目 1-2
- Python中tile函数的用法