Redian新闻
>
ink plus 加个employee card 送 5k点么?
avatar
ink plus 加个employee card 送 5k点么?# Money - 海外理财
W*e
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];
}
};
avatar
n*i
2
7月份申请的ink plus, 现在想加个employee card,不知道有没有5k点送?
有人试过么?
avatar
p*p
3
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;

avatar
W*e
4

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

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

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

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

avatar
n*g
6
纯属好奇问问,楼主的复杂度应该是多少?

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

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

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

avatar
l*b
8
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;
}
avatar
p*p
9
我认为是Nk
跟逐个合并是一回事

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

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

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

avatar
l*8
11
NlogK吧

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

avatar
p*p
12
为啥?不是一共合并了1 + 2 + 4 + 8 + ... + k / 2次么?

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

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

【在 p*****p 的大作中提到】
: 为啥?不是一共合并了1 + 2 + 4 + 8 + ... + k / 2次么?
avatar
d*r
15
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).
avatar
l*8
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).

avatar
W*e
17

我赞同。

【在 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).

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。