023 - Merge k Sorted Lists
2015-11-11 18:26
260 查看
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
k路归并
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *tail = NULL, *head = NULL;
if (NULL == l1 || NULL == l2) {
return l2? l2 : l1;
}
if (l1->val <= l2->val) {
head = tail = l1;
l1 = l1->next;
} else {
head = tail = l2;
l2 = l2->next;
}
tail->next = NULL;
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
tail = tail->next;
l1 = l1->next;
} else {
tail->next = l2;
tail = tail->next;
l2 = l2->next;
}
tail->next = NULL;
}
tail->next = l1? l1:l2;
return head;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
if (listsSize == 0) return NULL;
int first = 0, second = 0, i, k;
while (listsSize > 1) {
k = 0;
for (i = 0; 2 * i < listsSize; i ++) {
first = 2 * i; second = first + 1;
if (first < listsSize - 1) {
lists[i] = mergeTwoLists(lists[first], lists[second]);
k++;
} else {
lists[i] = lists[first];
}
}
listsSize -= k;
}
return lists[0];
}
k路归并
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *tail = NULL, *head = NULL;
if (NULL == l1 || NULL == l2) {
return l2? l2 : l1;
}
if (l1->val <= l2->val) {
head = tail = l1;
l1 = l1->next;
} else {
head = tail = l2;
l2 = l2->next;
}
tail->next = NULL;
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
tail = tail->next;
l1 = l1->next;
} else {
tail->next = l2;
tail = tail->next;
l2 = l2->next;
}
tail->next = NULL;
}
tail->next = l1? l1:l2;
return head;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
if (listsSize == 0) return NULL;
int first = 0, second = 0, i, k;
while (listsSize > 1) {
k = 0;
for (i = 0; 2 * i < listsSize; i ++) {
first = 2 * i; second = first + 1;
if (first < listsSize - 1) {
lists[i] = mergeTwoLists(lists[first], lists[second]);
k++;
} else {
lists[i] = lists[first];
}
}
listsSize -= k;
}
return lists[0];
}
相关文章推荐
- sqlite3 中执行带变量的命令
- dex & oat & ELF & art
- iOS笔记UI--ipad分页控件
- 什么是面向对象?
- Spring集成Quartz定时任务框架介绍和Cron表达式详解
- 机器学习(十七)主成分分析(Principle Component Analysis)
- Perl中调用路径接口(返回值为json)发送邮件
- Eclipse快捷键 10个最有用的快捷键
- OneAlert实现zabbix全方位告警
- 024.ArrayList中方法详解
- UE4 Android Device Compatibility
- ios学习笔记(一)
- Debug 运行正常,Release版本不能正常运行
- S3C2440视频驱动V4L2
- 022 - Generate Parentheses
- nova-compute不能成功启动的原因总结
- 021 - Merge Two Sorted Lists
- 大数据
- java 中 如何让一个方法内最多只能指定数量线程访问
- UE4.9 Hardware & Software Specifications