由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一个merge K sorted list的时间复杂度
相关主题
弱问一个小问题,leetcode 上merge sorted list透露两个G的onsite题
请问大牛们如何提高解决leetcode上面Linkedlist的题的能力?面试题
[BSSD]回国一趟回来做题很难进入状态了,顺便问下那个Merge k Sortedleetcode 上的k way merge
请大家 看看这个 Merge k Sorted Lists (Java), 我不太明白LeetCode:Partition List 哪位帮我看看, 为什么总是TLE
一道挺简单的题给搞砸了请教大牛: Leetcode partition list: Time Limit Exceeded
问个reverse linked list发个pure storage的interviewstreet题目
合并两个排序好的链表, 优解?请大牛review一下这个Insertion Sort List的解法
弱问题,连反转链表都看不懂了再问大牛们leetcode上面Linkedlist的题,Reverse Nodes in k-G
相关话题的讨论汇总
话题: listnode话题: lists话题: null话题: halfsize话题: h2
进入JobHunting版参与讨论
1 (共1页)
W********e
发帖数: 45
1
我的办法就是进行二分,将k个链表分为两个一组,组内进行merge。形成一个新的链表
集合。继续两个一组merge,这样下去一共会进行logk次merge,最后merge成为一个链
表。这里用的辅助函数是mergeSortedList,合并两个有序链表,这个辅助函数复杂度
应该是O(n)。
我觉得这个算法的总时间复杂度是O(nlogK),大家觉得对吗??
class Solution {
public:
ListNode* mergeSortedList(ListNode*l1,ListNode*l2)
{
ListNode *h1=l1,*h2=l2;
ListNode *newHead=new ListNode(0),*dummy=newHead; //newHead要赋
值,否则没有next。如果是C语言的话可以申请stack的对象
if(l1==NULL&&l2==NULL)
return NULL;
while(h1!=NULL&&h2!=NULL)
{
if(h1->val>=h2->val)
{
dummy->next=h2;
dummy=h2;
h2=h2->next;
}
else
{
dummy->next=h1;
dummy=h1;
h1=h1->next;
}
}
if(h1==NULL)
dummy->next = h2;
else if(h2==NULL)
dummy->next= h1;
return newHead->next;
}
ListNode *mergeKLists(vector &lists) {
if(lists.size() == 0)
return NULL;
int curSize = lists.size();
while(curSize > 1) {
int halfSize = (1 + curSize) / 2;
//merge i,i + halfSize
for(int i = 0 ; i < halfSize && i + halfSize < curSize; ++i) {
ListNode *first = lists[i];
ListNode *second = lists[i + halfSize];
ListNode *result = mergeSortedList(first,second);
lists[i] = result;
}
//set curSize to halfsize
curSize = halfSize;
}
return lists[0];
}
};
p*****p
发帖数: 379
2
new完没有delete
复杂度不对
用heap就行了,其他纯属吃力不讨好

【在 W********e 的大作中提到】
: 我的办法就是进行二分,将k个链表分为两个一组,组内进行merge。形成一个新的链表
: 集合。继续两个一组merge,这样下去一共会进行logk次merge,最后merge成为一个链
: 表。这里用的辅助函数是mergeSortedList,合并两个有序链表,这个辅助函数复杂度
: 应该是O(n)。
: 我觉得这个算法的总时间复杂度是O(nlogK),大家觉得对吗??
: class Solution {
: public:
: ListNode* mergeSortedList(ListNode*l1,ListNode*l2)
: {
: ListNode *h1=l1,*h2=l2;

W********e
发帖数: 45
3

哦对没有delete。我用C语言写面试题,用heap感觉不太方便啊,怎么办?

【在 p*****p 的大作中提到】
: new完没有delete
: 复杂度不对
: 用heap就行了,其他纯属吃力不讨好

p*****p
发帖数: 379
4
当场写白板你可以说假设有heap这么个容器,对方不同意的话就写个heapify函数好了
,我感觉当场写的话这些halfSize要一下搞对也不容易啊……
而且你都用了new了……C++有priority_queue的STL

【在 W********e 的大作中提到】
:
: 哦对没有delete。我用C语言写面试题,用heap感觉不太方便啊,怎么办?

n*****g
发帖数: 178
5
纯属好奇问问,楼主的复杂度应该是多少?

【在 p*****p 的大作中提到】
: new完没有delete
: 复杂度不对
: 用heap就行了,其他纯属吃力不讨好

r*********n
发帖数: 4553
6
用indexed priority queue(其实就是heap,但是不需要自己写,除非面馆要求)或者
一般的priority queue,但是进去的是pair,然后overwrite operator<
for pair,pair的第二个是list index。

【在 W********e 的大作中提到】
:
: 哦对没有delete。我用C语言写面试题,用heap感觉不太方便啊,怎么办?

l*******b
发帖数: 2586
7
ListNode *mergeKLists(vector &lists) {
if(lists.empty())
return NULL;
int n = lists.size();
while(n > 1) {
int i;
for(i = 0; i < n/2; ++i)
lists[i] = mergeTwoList(lists[2*i], lists[2*i+1]);
if(n % 2) {
lists[i] = lists[n-1];
n = n/2 + 1;
} else
n = n/2;
}
return lists[0];
}
ListNode *mergeTwoList(ListNode *s, ListNode *t) {
ListNode *h, **c = &h;
while(s && t) {
if(s->val < t->val) {
*c = s;
s = s->next;
} else {
*c = t;
t = t->next;
}
c = &(*c)->next;
}
if(s)
*c = s;
else
*c = t;
return h;
}
p*****p
发帖数: 379
8
我认为是Nk
跟逐个合并是一回事

【在 n*****g 的大作中提到】
: 纯属好奇问问,楼主的复杂度应该是多少?
Y**3
发帖数: 21
9

可以用C++算法库里的heap操作make_heap,push_heap等

【在 W********e 的大作中提到】
:
: 哦对没有delete。我用C语言写面试题,用heap感觉不太方便啊,怎么办?

l*********8
发帖数: 4642
10
NlogK吧

【在 p*****p 的大作中提到】
: 我认为是Nk
: 跟逐个合并是一回事

相关主题
问个reverse linked list透露两个G的onsite题
合并两个排序好的链表, 优解?面试题
弱问题,连反转链表都看不懂了leetcode 上的k way merge
进入JobHunting版参与讨论
p*****p
发帖数: 379
11
为啥?不是一共合并了1 + 2 + 4 + 8 + ... + k / 2次么?

【在 l*********8 的大作中提到】
: NlogK吧
l*********8
发帖数: 4642
12
对,楼主的算法是NK。 我以为说的是用heap的算法, 看错了。

【在 p*****p 的大作中提到】
: 为啥?不是一共合并了1 + 2 + 4 + 8 + ... + k / 2次么?
l*********8
发帖数: 4642
13
对,楼主的算法是NK。 我以为说的是用heap的算法, 看错了。

【在 p*****p 的大作中提到】
: 为啥?不是一共合并了1 + 2 + 4 + 8 + ... + k / 2次么?
d********r
发帖数: 38
14
NLogK, N is the total number of elements in K lists
Merging two lists with length N1 and N2 is O(N1+N2)
So the first round of k/2 merges totally took O(N) time
So as the second round, etc.
The total number of rounds is LogK, so O(NlogK).
l*********8
发帖数: 4642
15
对。 我刚才是怎么想的。。。。

【在 d********r 的大作中提到】
: NLogK, N is the total number of elements in K lists
: Merging two lists with length N1 and N2 is O(N1+N2)
: So the first round of k/2 merges totally took O(N) time
: So as the second round, etc.
: The total number of rounds is LogK, so O(NlogK).

W********e
发帖数: 45
16

我赞同。

【在 d********r 的大作中提到】
: NLogK, N is the total number of elements in K lists
: Merging two lists with length N1 and N2 is O(N1+N2)
: So the first round of k/2 merges totally took O(N) time
: So as the second round, etc.
: The total number of rounds is LogK, so O(NlogK).

1 (共1页)
进入JobHunting版参与讨论
相关主题
再问大牛们leetcode上面Linkedlist的题,Reverse Nodes in k-G一道挺简单的题给搞砸了
java 链表里面dummy node 一问?谢谢问个reverse linked list
明天电面,求建议合并两个排序好的链表, 优解?
关于priority_queue一问弱问题,连反转链表都看不懂了
弱问一个小问题,leetcode 上merge sorted list透露两个G的onsite题
请问大牛们如何提高解决leetcode上面Linkedlist的题的能力?面试题
[BSSD]回国一趟回来做题很难进入状态了,顺便问下那个Merge k Sortedleetcode 上的k way merge
请大家 看看这个 Merge k Sorted Lists (Java), 我不太明白LeetCode:Partition List 哪位帮我看看, 为什么总是TLE
相关话题的讨论汇总
话题: listnode话题: lists话题: null话题: halfsize话题: h2