将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
#include <iostream>
using namespace std;
class Solution {
public:
//个人第一想法版本(非递归迭代)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr && l2 == nullptr)return nullptr;
if (l1 == nullptr)return l2;
if (l2 == nullptr)return l1;
//头节点
ListNode* headNode = l1->val <= l2->val ? l1 : l2;
//当前已经判断出来的部分链表的末尾倒数第二个节点
ListNode* preNode = nullptr;
while (l1 != nullptr && l2 != nullptr)
{
ListNode* tempNode = nullptr;
if (l1->val <= l2->val)
{
//暂时保存当前正在判断的节点的下一个节点,用作下一个循环的判断,以免next赋值时找不到下一个要判断的节点
tempNode = l1->next;
l1->next = l2;
//若preNode为空说明需要初始化,初始化为第一次循环时的“出度”节点
//若preNode不为空,则判断preNode指向的节点是否 与 当前循环中的“出度”节点一同指向了同一个“入度”节点,若是,则需要调节一下
// 例如:1 2 3
// 5 6 7
// 当已经是1->>5时,若此次循环中,2->>5,则需要判断1与2是否都是指向5,如果是的话,就要将1->>2
// 最后再下移preNode节点
if (preNode != nullptr)
{
if(preNode->next == l2)
preNode->next = l1;
preNode = preNode->next;
}
else preNode = l1;
l1 = tempNode;
}
else
{
tempNode = l2->next;
l2->next = l1;
if (preNode != nullptr)
{
if (preNode->next == l1)
preNode->next = l2;
preNode = preNode->next;
}
else preNode = l2;
l2 = tempNode;
}
}
return headNode;
}
//个人第二想法版本(非递归迭代)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
if (l1 == nullptr && l2 == nullptr)return nullptr;
if (l1 == nullptr || l2 == nullptr)return l1 == nullptr ? l2 : l1;
//头节点
ListNode* headNode = l1->val <= l2->val ? l1 : l2;
if (headNode == l1)l1 = l1->next;
else l2 = l2->next;
//当前合并后的部分链表的末尾节点
ListNode* currentNode = headNode;
while (l1 != nullptr && l2 != nullptr)
{
if(l1->val <= l2->val)
{
currentNode->next = l1;
l1 = l1->next;
currentNode = currentNode->next;
}else
{
currentNode->next = l2;
l2 = l2->next;
currentNode = currentNode->next;
}
}
//将未插入的节点补全
if (l1)currentNode->next = l1;
else currentNode->next = l2;
return headNode;
}
//个人第三想法版本(递归)
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
if (l1 == nullptr && l2 == nullptr)return nullptr;
if (l1 == nullptr || l2 == nullptr)return l1 == nullptr ? l2 : l1;
//头节点
ListNode* headNode = nullptr;
if(l1->val <= l2->val)
{
headNode = l1;
//l1->next开始的链表与l2开始的链表进行合并之后的链表的头节点
headNode->next = mergeTwoLists(l1->next, l2);
}else
{
headNode = l2;
//l1开始的链表与l2->next开始的链表进行合并之后的链表的头节点
headNode->next = mergeTwoLists(l1, l2->next);
}
return headNode;
}
};