#include "iostream"
#include "vector"
#include "queue"
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
void print(ListNode *head)
{
ListNode *p = head;
while (p != NULL)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
{
if (l1 == NULL)
{
return l2;
}
else if (l2 == NULL)
{
return l1;
}
ListNode *p1, *p2, *s;
if (l1->val <= l2->val)
{
p1 = l1;
p2 = l2;
}
else
{
p1 = l2;
p2 = l1;
l1 = l2;
}
while (p2 != NULL)
{
if (p1->next == NULL)
{
p1->next = p2;
return l1;
}
if (p1->next->val < p2->val)
{
p1 = p1->next;
}
else
{
s = p2->next;
p2->next = p1->next;
p1->next = p2;
p2 = s;
}
}
return l1;
}
ListNode *mergeKLists(vector<ListNode *> &lists)
{
int size = lists.size();
if (size == 0)
{
return NULL;
}
if (size == 1)
{
return lists[0];
}
//将vector转为队列,转换成归并排序
queue<ListNode *> waiting(deque<ListNode *>(lists.begin(), lists.end()));
//如果队列元素数目大于1,则取出两个进行合并,放到队列尾部
while (waiting.size() > 1)
{
// 注意pop无返回值
ListNode *l1 = waiting.front();
waiting.pop(); // 弹出l1
ListNode *l2 = waiting.front();
waiting.pop(); // 弹出l2
waiting.push(mergeTwoLists(l1, l2));
}
return waiting.front();
}
};
int main(int argc, char const *argv[])
{
ListNode *p;
vector<ListNode *> lists;
int k, x;
Solution so;
cout << "K=";
cin >> k;
for (int i = 0; i < k; i++)
{
cin >> x;
p = new ListNode(x);
lists.push_back(p);
while (true)
{
cin >> x;
p->next = new ListNode(x);
p = p->next;
if (cin.get() == '\n')
break;
}
}
ListNode *head = so.mergeKLists(lists);
so.print(head);
return 0;
}