23.合并k个有序链表(hard)
应该属于hard里面的easy题吧
题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解题方法
每次合并两个,代码如下:
struct ListNode * MergeTwoLists(struct ListNode * l1, struct ListNode * l2)
{
struct ListNode * p, *q; // 分别指向l1,l2
struct ListNode * tail; // 指向新链表表尾
struct ListNode * Head = (struct ListNode *)malloc(sizeof(struct ListNode));
p = l1; q = l2;
tail = Head;
while (p != NULL && q != NULL)
{
if (p->val <= q->val)
{
tail->next = p;
p = p->next;
}
else
{
tail->next = q;
q = q->next;
}
tail = tail->next;
}
if (p == NULL)
tail->next = q;
else if (q == NULL)
tail->next = p;
return Head->next;
}
struct ListNode * mergeKLists(struct ListNode** lists, int listsSize)
{
int i;
struct ListNode * l;
if (listsSize == 0)
return NULL;
if (listsSize == 1)
return lists[0];
l = MergeTwoLists(lists[0], lists[1]);
if (listsSize == 2)
return l;
for (i = 2; i < listsSize; i++)
{
l = MergeTwoLists(l, lists[i]);
}
return l;
}
执行时间有点慢
以后再来优化吧,mark