1.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
递归解法:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr)
{
return l2;
}
else if (l2 == nullptr)
{
return l1;
}
else if (l1->val < l2->val)
{
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else
{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
迭代解法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null)
{
if (l1.val <= l2.val)
{
prev.next = l1;
l1 = l1.next;
}
else
{
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = (l1 == null ? l2 : l1);
return prehead.next;
}
}
2.合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
auto head = ListNode(0);
auto comp = [](ListNode* const &a, ListNode* const &b){return a->val > b->val;};
priority_queue<ListNode*, vector<ListNode*>, decltype(comp)> q(comp);
for (auto &h : lists) if (h != nullptr) q.push(h);
auto p = &head;
while (!q.empty()) {
p->next = q.top();
p = p->next;
q.pop();
if (p->next != nullptr) q.push(p->next);
}
return head.next;
}
};