题目: 传送门
题意: 给k个升序链表,合并成一条升序链表
方法一:
根据力扣21合并两个升序链表,然后遍历k个升序链表,两两合并。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/*class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
}
};*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head;
ListNode* p = new ListNode;
head = p;
while (l1 && l2) {
ListNode* q = new ListNode;
if (l1->val <= l2->val) {
q->val = l1->val;
l1 = l1->next;
}
else {
q->val = l2->val;
l2 = l2->next;
}
p->next = q;
p = q;
}
if(l1)
p->next=l1;
if(l2)
p->next=l2;
/*while (l1) {
ListNode* q = new ListNode;
q->val = l1->val;
l1 = l1->next;
p->next = q;
p = q;
}
while (l2) {
ListNode* q = new ListNode;
q->val = l2->val;
l2 = l2->next;
p->next = q;
p = q;
}*/
head = head->next;
return head;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* head;
head=NULL;
int len = lists.size();
for (int i = 0; i < len; i++) {
head = mergeTwoLists(head, lists[i]);
}
return head;
}
};
明显直接暴力会时间超限。
方法二:
同样时暴力,但是一块一块的进行链接,例如l1,l2两条链表,两个都是升序,可以通过判断第一个元素,找到插入的位置,然后将一个链表直接插入那个位置,然后剩余的继续插入新的链。
class Solution {
public:
ListNode* find(ListNode* head, int x) {
if (!head) {
return head;
}
while (head->next) {
if ((head->next)->val > x) {
break;
}
head = head->next;
}
return head;
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) {
return l2;
}
if (!l2) {
return l1;
}
ListNode* head,*ans;
ListNode* p,*q;
ans = (l1->val<=l2->val)?l1:l2;
while (l2&&l1) {
if (l1->val <= l2->val) {
head = find(l1, l2->val);
if (!head->next) {
head->next = l2;
return ans;
}
p = head->next;
head->next = l2;
}
else {
head = find(l2, l1->val);
if (!head->next) {
head->next = l1;
return ans;
}
p = head->next;
head->next = l1;
}
l1 = ans;
l2 = p;
}
return ans;
/*while (head->next) {
if ((head->next)->val > l2->val) {
break;
}
head = head->next;
}*/
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* head;
int len = lists.size();
if (len == 0) {
head = NULL;
return head;
}
head = lists[0];
for (int i = 1; i < len; i++) {
head = mergeTwoLists(head, lists[i]);
}
return head;
}
};
然后卡过。