Merge k Sorted Lists
来源:互联网 发布:软件外包群 编辑:程序博客网 时间:2024/06/05 20:30
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:两个链表合并的延伸,最简单的方法是,lists中的链表以此合并即:1和2合并;(1+2)和3合并,。。。。以此类推,直到全部合并完,假设链表的平均长度为n,显然需要遍历的链表节点数为(2+3+4+…+k)n,时间复杂度为O(nk^2).
代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; if(l1->val > l2->val)//l1的首个元素保持最小 swap(l1, l2); ListNode *p = l1, *q = l2, *pre; while(p && q){ if(p->val <= q->val){ pre = p; p = p->next; } else{ ListNode *tmp = new ListNode(q->val); tmp->next = pre->next; pre->next = tmp; pre = pre->next; q = q->next; } } if(q) pre->next = q; return l1; } ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.empty() || lists.size() == 0) return NULL; int len = lists.size(); if(len == 1) return lists[0]; ListNode* ret = NULL; for(int i = 0; i < len; ++i) ret = mergeTwoLists(ret, lists[i]); return ret; }};
测试后发现超时,优化的思路是链表合并采用两个两个合并的方式,也就是分治的思想,这样能将合并的次数由k降为logk,因此时间复杂度为O(nklogk),测试通过,代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; if(l1->val > l2->val)//l1的首个元素保持最小 swap(l1, l2); ListNode *p = l1, *q = l2, *pre; while(p && q){ if(p->val <= q->val){ pre = p; p = p->next; } else{ ListNode *tmp = new ListNode(q->val); tmp->next = pre->next; pre->next = tmp; pre = pre->next; q = q->next; } } if(q) pre->next = q; return l1; } 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++) lists[i] = mergeTwoLists(lists[i], lists[i + k]); n = k; } return lists[0]; }};
0 0
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Windows API函数大全
- IE附图(Image对象)显示内存溢出解决方案
- 安卓ADT离线安装教程
- 富文本Html.fromHtml方法
- 常见问题总结篇 一 、Objective C 方法和 C方法的混合调用
- Merge k Sorted Lists
- static用途
- Problem 10:Regular Expression Matching
- 虚拟局域网技术详解
- Swift - 基本运算符
- 自己实现简单RPC功能
- 《剑指Offer》面试题:从尾到头打印链表
- SPFA
- CGI