題意
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
將K個排好序的鏈表合併成一個
解法
和之前合併兩個有序鏈表那題不同,那題用的是兩個指針來分別記錄兩個鏈表中的位置,將小的那個插入新鏈表然後指針右移,有點像歸併排序時用到的方法。這題如果用K個指針來記錄的話,每次需要找出最小的那個值,比較麻煩,所以採用的優先隊列,首先將所有鏈表的第一個值入隊,然後每次將值最小的一個出隊插入新鏈表裏,再將這個元素的下一個元素入隊。
class Solution
{
struct Node
{
int val;
ListNode * next = nullptr;
bool operator <(const Node & r) const
{
return val > r.val;
}
};
public:
ListNode* mergeKLists(vector<ListNode*>& lists)
{
int count = lists.size();
priority_queue<Node> que;
for(int i = 0;i < lists.size();i ++)
{
Node temp;
if(lists[i])
{
temp.val = lists[i] -> val;
temp.next = lists[i] -> next;
que.push(temp);
}
}
ListNode * head = nullptr;
ListNode * cur = nullptr;
while(!que.empty())
{
ListNode * node = new ListNode(0);
Node poped = que.top();
que.pop();
node -> val = poped.val;
node -> next = poped.next;
if(poped.next)
{
Node temp;
temp.val = poped.next -> val;
temp.next = poped.next -> next;
que.push(temp);
}
if(head == nullptr)
{
head = node;
cur = node;
}
else
{
cur -> next = node;
cur = cur -> next;
}
}
return head;
}
};