题目(困难)
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
暴力解法(可通过)
我们遍历所有的链表,把所有的值都存在一个数组中
将数组排序
然后创建一个空链表,把数组中每个元素依次填入链表中即可
ListNode* mergeKLists(vector<ListNode*>& lists) {
vector<int> later;
for (auto list : lists) {
ListNode* p = list;
while (p != NULL) {
later.push_back(p->val);
p = p->next;
}
}
//数组中添加完成
if (later.size() == 0){
return NULL;
}
sort(later.begin(), later.end());
//创建链表
ListNode* ans = new ListNode(later[0]);
ListNode* p = ans;
for (int i = 1; i < later.size(); i++) {
p->next = new ListNode(later[i]);
p = p->next;
}
return ans;
}
复杂度分析
时间复杂度:O(NlogN),其中N是节点的数目
空间复杂度:O(N)空间
顺序合并
我们可以写一个函数,合并两个链表,然后我们遍历一次给定的数组即可
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* ans= new ListNode(-1);
ListNode* head = ans;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
head->next = l1;
l1 = l1->next;
head = head->next;
}
else {
head->next = l2;
l2 = l2->next;
head = head->next;
}
}
head->next = l1 == NULL ? l2 : l1;
return ans->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* ans = NULL;
for (int i = 0; i < lists.size()-1; i++) {
ans=mergeTwoLists(ans, lists[i]);
}
return ans;
}
合并两个链表的细节我就不写了,给大家一篇之前的博客
链接
复杂度分析
时间复杂度:O(K^2N)
空间复杂度:O(1)
由于暂时能力有限 之后我会更新新的解法
希望我所写的对大家有帮助