leetcode 23. Merge k Sorted Lists
来源:互联网 发布:dilili软件下载 编辑:程序博客网 时间:2024/06/08 22:54
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
提议很简单,就是归并排序。
首先想到的即使逐个归并得到最终的结果,但是会超时,这是因为这种会造成数组的size大小不一样,导致归并排序的时间变长;
最好的做法是两两合并,然后在两两合并,这样不会超时,
需要注意的是cap=(size+1)/2,这个是考虑到奇数的情况。
代码如下:
/* class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }*/public class Solution { /* * 按照次序两两合并,会超时 * */ public ListNode mergeKLists111(ListNode[] lists) { ListNode head=new ListNode(-1); if(lists.length<=0) return head.next; if(lists.length==1) return lists[0]; //这个循环属于遍历方法 for(int i=0; i<lists.length;i++) head.next=merge(head.next,lists[i]); return head.next; } /* * 注意分析数组元素数量为0个和1个时候的特殊情况 * * 很明显可以使用二分方法去做 * */ public ListNode mergeKLists(ListNode[] lists) { ListNode head=new ListNode(-1); if(lists.length<=0) return head.next; if(lists.length==1) return lists[0]; int len=lists.length; while(len>1) { int cap=(len+1)/2; for(int i=0;i<len/2;i++) lists[i]=merge(lists[i], lists[i+cap]); len=cap; } return lists[0]; } private ListNode merge(ListNode listNode, ListNode listNode2) { ListNode iter1=listNode; ListNode iter2=listNode2; ListNode head=new ListNode(-1); ListNode he=head; while(iter1!=null && iter2!=null) { if(iter1.val<=iter2.val) { he.next=new ListNode(iter1.val); he=he.next; iter1=iter1.next; } else { he.next=new ListNode(iter2.val); he=he.next; iter2=iter2.next; } } while(iter1!=null) { he.next=new ListNode(iter1.val); he=he.next; iter1=iter1.next; } while(iter2!=null) { he.next=new ListNode(iter2.val); he=he.next; iter2=iter2.next; } return head.next; }}
C++版本的答案如下,这个和CUDA的归并很像,
代码如下:
#include <iostream>#include <vector>using namespace std;/*struct ListNode{int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};*/class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.size() <= 0) return NULL; if (lists.size() == 1) return lists[0]; int len = lists.size(); while (len > 1) { int cap = (len + 1) / 2; for (int i = 0; i < len/2; i++) lists[i] = mergeTwoLists(lists[i], lists[i + cap]); len = cap; } return lists[0]; } ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* head = new ListNode(-1); ListNode* a = head; while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { a->next = new ListNode(l1->val); l1 = l1->next; a = a->next; } else { a->next = new ListNode(l2->val); l2 = l2->next; a = a->next; } } while (l1 != NULL) { a->next = new ListNode(l1->val); l1 = l1->next; a = a->next; } while (l2 != NULL) { a->next = new ListNode(l2->val); l2 = l2->next; a = a->next; } return head->next; }};
阅读全文
0 0
- leetcode 23. LeetCode 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
- Leetcode-23.Merge k Sorted Lists
- [Leetcode]23. Merge k Sorted Lists @python
- 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
- LeetCode-23.Merge k Sorted Lists
- Leetcode 23. Merge k Sorted Lists
- vim模式介绍
- Java 中的流(stream)
- 子网划分
- centos7配置安装zookeeper3.4.10
- 02_找第一个只出现一次的字符
- leetcode 23. Merge k Sorted Lists
- Objective-C对象模型
- C++ 图论-Kruskal算法
- Linux系统C/C++编程基础
- php cgi 和cli 的区别
- IO设计模式:Reactor和Proactor对比
- 去掉ifream滚动条
- 关于arcgis server 发布地图的时候报错"Packaging succeeded but publishing failed"问题解决
- 2017/8/31日常笔记——后端总结(一)