文章

LeetCode23 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6

有了上一个例子21的思路,这个题目就好做了,只需要设置一个头结点,然后三个互相比较不断的调整头结点的指向即可。 后面又想了想,这样做有点不太好实现,可以把每个list的节点push到同一个vector中,比较提取出最小的值,然后一一保存,最后链接这些值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
ListNode* mergeKLists(vector<ListNode*>& lists) 
{
	int len = lists.size();
	if (len ==1)
	{
		return lists[0];
	}
	if (len ==0)
	{
		return NULL;
	}
	vector<ListNode*> resultSet;
	for (int i=0;i<len;i++)
	{
		ListNode* head = lists[i];
		while (head!=NULL)
		{
			resultSet.push_back(head);
			head = head->next;
		}
	}
	std::sort(resultSet.begin(),resultSet.end(),cmp);
	resultSet.push_back(NULL);
	for (int j=0;j<resultSet.size()-1;j++)
	{
		resultSet[j]->next = resultSet[j + 1];
	}
	return resultSet[0];
}
bool cmp(const ListNode* a, const ListNode* b)
{
	if (a->val < b->val)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

写出来了,但是无法通过测试,会报错。 故直接看答案改写另一种方法。 答案使用分治归并的思想解答。 最终代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
ListNode* mergeKLists(vector<ListNode*>& lists) 
{
	int len = lists.size();
	if (len == 0)
	{
		return NULL;
	}
	if (len == 1)
	{
		return lists[0];
	}
	if (len == 2)
	{
		return mergeTwoLists(lists[0], lists[1]);
	}
	int mid = len / 2;
	vector<ListNode*> sub1_lists;
	vector<ListNode*> sub2_lists;
	int i;
	for (i=0;i<mid;i++)
	{
		sub1_lists.push_back(lists[i]);
	}
	for (int j = i;j<len;j++)
	{
		sub2_lists.push_back(lists[j]);
	}
	ListNode* l1 = mergeKLists(sub1_lists);
	ListNode* l2 = mergeKLists(sub2_lists);
 
	return mergeTwoLists(l1, l2);
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
	if (l1==NULL)
	{
		return l2;
	}
	if (l2 ==NULL)
	{
		return l1;
	}
	ListNode* p;
	ListNode* head = p;
	while (l1 !=NULL && l2 != NULL)
	{
		if (l1->val<l2->val)
		{
			head->next = l1;
			head = l1;
			l1 = l1->next;
		}
		else
		{
			head->next = l2;
			head = l2;
			l2 = l2->next;
		}
		if (l1==NULL)
		{
			head->next = l2;
		}
		if (l2 == NULL)
		{
			head->next = l1;
		}
	}
	return p;
}

本文由作者按照 CC BY 4.0 进行授权