23. Merge k Sorted Lists

题意:

给一堆已排序链表,合并成一个已排序链表
试了几个方法,最高的大概Runtime排行才71%,不过不知道这个runtime为什么每次都不一样,有的时候能到99%。。。还是我菜啊。

思路1:

就是和之前两个链表合并的思想一样,每次找所有链表里最大的头结点,移动。

ListNode* mergeKLists1(vector<ListNode*>& lists) {//19%
	vector<int> num;
	ListNode *res=NULL, *temp=NULL,*min_list;
	int sz = lists.size(), min_a,min_b;
	for (int i = 0; i < sz; ++i) {
		if (!lists[i]) {
			lists.erase(lists.begin() + i);
			--i;
			--sz;
		}
	}
	if (sz == 0)
		return NULL;
	for (int i = 0; i < sz; ++i)
		num.push_back(i);
	while (sz>1) {
		min_a = INT_MAX;
		for (int i = 0; i < sz; ++i) {
			if (min_a > lists[num[i]]->val) {
				min_list = lists[num[i]];
				min_a = min_list->val;
				min_b = i;
			}
		}
		if (!temp) {
			res = temp = min_list;
		}
		else {
			res->next = min_list;
			res = res->next;
		}
		lists[num[min_b]] = lists[num[min_b]]->next;
		if (!lists[num[min_b]]) { 
			num.erase(num.begin() + min_b); 
			sz--;
		}
	}
	if (res)
		res->next = lists[num[0]];
	else
		return lists[0];
	return temp;
}

思路2:

在思路1的基础上使用二分法优化

ListNode* MergeList(ListNode* a, ListNode*b) {
	if (!a) return b;
	if (!b) return a;
	if (a->val > b->val) swap(a, b);
	ListNode *res = a, *temp = a;
	a = a->next;
	while (a&&b) {
		if (a->val > b->val) {
			temp->next = b;
			temp = temp->next;
			b = b->next;
		}
		else {
			temp->next = a;
			temp = temp->next;
			a = a->next;
		}
	}
	if (a)
		temp->next = a;
	if (b)
		temp->next = b;
	return res;
}


ListNode* mergeKLists2(vector<ListNode*>& lists) {//52.59%
	int sz = lists.size();
	if (sz == 2)
		return MergeList(lists[0], lists[1]);
	if (sz == 1)
		return lists[0];
	if (sz == 0)
		return NULL;
	vector<ListNode*> L(lists.begin(), lists.begin() + sz / 2);
	vector<ListNode*> R(lists.begin() + sz / 2, lists.end());
	return MergeList(mergeKLists2(L), mergeKLists2(R));
}

思路三:

在1的基础上使用堆进行优化,将每个链表的头结点塞入大顶堆,取堆顶后连接在总链表后面再将取出结点的下一结点放入堆中。重复上述操作

ListNode* mergeKLists3(vector<ListNode*>& lists) {
	priority_queue< ListNode*, vector<ListNode*>, greater<int>> pq;
	for (auto l : lists)
		if (l)
			pq.push(l);
	ListNode *node, *head;
	head = NULL;
	while (!pq.empty()) {
		node = pq.top();
		pq.pop();
		if (!head)
			head = node;
		if (node->next)
			pq.push(node->next);
		node->next = pq.empty() ? NULL : pq.top;
	}
	return head;
}
全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
443459次浏览 4523人参与
# 春招别灰心,我们一人来一句鼓励 #
42266次浏览 539人参与
# 阿里云管培生offer #
120470次浏览 2221人参与
# 地方国企笔面经互助 #
7975次浏览 18人参与
# 同bg的你秋招战况如何? #
77249次浏览 569人参与
# 实习必须要去大厂吗? #
55816次浏览 961人参与
# 北方华创开奖 #
107476次浏览 600人参与
# 虾皮求职进展汇总 #
116395次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11702次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2455021次浏览 34861人参与
# 提前批简历挂麻了怎么办 #
149962次浏览 1979人参与
# 在找工作求抱抱 #
906124次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4764次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196058次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157650次浏览 2267人参与
# 双非本科求职如何逆袭 #
662406次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12808次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35929次浏览 384人参与
# 简历中的项目经历要怎么写? #
86943次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20154次浏览 240人参与
# 我的上岸简历长这样 #
452080次浏览 8089人参与
牛客网
牛客企业服务