C++ 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2
输入:l1 = [], l2 = []
输出:[]
示例3
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
思路/解法
方式一
使用一个vector容器对两个升序链表排序结果进行记录,之后遍历vector容器,连接所有结点即可。
/**
* 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* mergeTwoLists(ListNode* list1, ListNode* list2)
{
vector<ListNode*> lists;
lists.clear();
while(list1 != nullptr && list2 != nullptr)
{
if(list1->val <= list2->val)
{
lists.push_back(list1);
list1 = list1->next;
}
else
{
lists.push_back(list2);
list2 = list2->next;
}
}
if(nullptr != list1)
{
lists.push_back(list1);
}
if(nullptr != list2)
{
lists.push_back(list2);
}
if(!lists.empty())
{
for(int i = 0;i < lists.size() - 1;i++)
{
lists[i]->next = lists[i + 1];
}
}
return lists.empty()?nullptr : lists[0];
}
};
方式二
简单迭代遍历,依次判断即可。
/**
* 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* mergeTwoLists(ListNode* list1, ListNode* list2)
{
ListNode* head = nullptr;
ListNode* curNode = nullptr;
ListNode** temp = nullptr;
bool isFirst = true;
while(list1 != nullptr && list2 != nullptr)
{
temp = (list1->val < list2->val)? &list1:&list2; //这里务必使用二级指针,因为temp如果是一级指针,那么temp = temp->next;是无法改变list1和list2的值的,而二级指针可以间接改变list1和list2的地址。
if(isFirst)
{
head = *temp;
curNode = *temp;
isFirst = false;
}
else
{
curNode->next = *temp;
curNode = curNode->next;
}
*temp = (*temp)->next;
}
if(nullptr != list1)
{
if(isFirst) //有一方链表为空
{
head = list1;
}
else //剩下结点直接补齐
{
curNode->next = list1;
}
}
if(nullptr != list2)
{
if(isFirst)
{
head = list2;
}
else
{
curNode->next = list2;
}
}
return head;
}
};