赞
踩
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
思路一:(迭代)
新建一个哑结点,循环把两个链表表头元素最小的那个链接到哑结点后面;
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:
void printList(ListNode* li) {
ListNode* li_cp = li;
while (li_cp != nullptr) {
cout << (li_cp->val) << " ";
li_cp = li_cp->next;
}
cout << "END" << endl;
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
//创建哑结点
ListNode temp = ListNode(0);
ListNode* pre = &temp;//新链表的工作指针
//如果两个都不为空
while (list1 && list2) {
//先把list1和list2中小的元素放到新链表中
if (list1->val < list2->val) {
pre->next = list1;
list1 = list1->next;
}
else {
pre->next = list2;
list2 = list2->next;
}
pre = pre->next;
}
// 合并后 list1 和 list2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
pre->next = (list1 == NULL ? list2 : list1);
return temp.next;
}
};
思路二:(递归)
链表合并递归问题的子问题:
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:
void printList(ListNode* li) {
ListNode* li_cp = li;
while (li_cp != nullptr) {
cout << (li_cp->val) << " ";
li_cp = li_cp->next;
}
cout << "END" << endl;
}
ListNode* mergeTwoLists1(ListNode* list1, ListNode* list2) {
//如果list1空了,就返回list2
if (list1 == NULL) return list2;
//如果list2空了,就返回list1
if (list2 == NULL) return list1;
//如果list1,list2都不空
//如果list1的值小于list2的值,那么就以list1的值为头,继续合并list1的下一个和list2
if (list1->val < list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1; //返回list1
}
//如果list2的值小于list1的值,那么就以list2的值为头,继续合并list2的下一个和list1
else {
list2->next = mergeTwoLists(list1, list2->next);
return list2; //返回list2
}
}
};
参考于此大佬的解题思路: traveller-lzx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。