题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
- 输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
遍历思路
因为原有的k个列表都是有序的,所以我们可以这样想:每次只从这些链表的表头取最小的加入新的链表(若有多个相同的最小值,则取多个)。这样最后得到的链表也是有序的。
所以我们只需要每次取比较每个链表的第一个即可。
不过比起其他题解的方法,这个时间复杂度要相对高是 O(n*m)n是链表数目,m是链表长度。
需要注意的是特殊值:只有一个链表,空集。
代码
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* ans = nullptr; // 开辟地址
ListNode* head = nullptr;
//queue<ListNode*>min_q; // 记录最小的是谁
queue<int>min_id;
int size = lists.size();
int i;
int empty_num = 0;
ListNode *temp;
while (empty_num < size)
{
for (i=0;i<size;i++)
{
if(lists[i])
{
temp=lists[i];
min_id.push(i); // 设定初始值
break;
}
}
empty_num = i; // 从i后一位开始即可
++i;
for (; i < size; i++)
{
if (!lists[i])
{ empty_num++;
continue; // 空了就不进行此
}
if (temp->val == lists[i]->val) // 最小值有多个
{
min_id.push(i);
}
else if (temp->val > lists[i]->val)
{
temp = lists[i];
while (!min_id.empty())
min_id.pop(); // 清空
min_id.push(i);
}
}
while (!min_id.empty()) {
int id = min_id.front();
min_id.pop();
// 记得要弹出啊!!!
if(ans) // 如果ans已经有地址了
{
//ListNode *tem=
int value=lists[id]->val;
ans->next=new ListNode(value);
ans = ans->next;
}
else{
ans = new ListNode();
ans->val=lists[id]->val;
}
if (!head)
head = ans;
lists[id] = lists[id]->next; // 往后挪动
}
}
return head;
}
};