解题思路:
1.获取信息:
所给的两个链表都按非递减顺序排列
两个链表的结点数目范围是 0 - 50 ,闭区间
结点的值在 -100 - 100 ,闭区间
2.分析题目:(由于主要是思想的碰撞,所以略过)
3.示例查验:
示例1:都不为空,就拼接
示例2:都为空,则返回空
示例3:其中一个为空,返回另一个即可
4.尝试编写代码:
(1)递归法
思路:借用了分治法的思想,把大问题拆分成小问题
我开始咯,接下来要好好看了
当我们开始比较两个链表的首元结点的元素时,无非就两种情况
1.第一条链表的元素大于第二条链表的元素
我们就可以将第二条链表的首元结点取下来放在一边,那个取下来的首元结点它的下一个结点你认为是什么?
第二条链表去掉首元结点后,在剩下的元素中的第一个元素是一个新的首元结点对吧
那么可以将这条第二条链表看作是一个新的链表
我们除去了那个结点后所形成的新的链表
那我们可以知道,我们取下来的那个结点的下一个结点肯定就是第一条链表和新形成的第二条链表拼接成的有序链表
你可以好好琢磨一下,我也可以给你图解辅助你理解
2.第一条链表的元素小于等于第二条链表的元素
同上,只不过取元素的链表变成了第一条链表而已
以下是完整代码
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1==nullptr)return list2;
else if(list2==nullptr)return list1;
if(list1->val<list2->val){
list1->next=mergeTwoLists(list1->next,list2);
return list1;
}else{
list2->next=mergeTwoLists(list1,list2->next);
return list2;
}
}
};
(2)迭代法
思路还是跟递归法的一样,唯一的不同就是,迭代法是用迭代来写的,可以来试试,检测一下自己是否真的懂了这道题,(有时候我们虽然做出来了一道题,也许有许多巧合因素,你多写一种方法在练手的同事,也可以加深你对这道题目所考知识的理解,更可以加深记忆,不怕写过一千道题的人,就怕一道题写出来一千种方法的人)
以下是完整代码
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//(我知道我结点的名字有点乱套了,但是,可以凑合看)
ListNode*temp=new ListNode();//构建一个结点
ListNode*dummy=temp;//构建一个指向该结点的指针
while(list1!=nullptr&&list2!=nullptr){//下面不好讲解,只可意会,不可言传
temp->next=list1->val<list2->val?list1:list2;
temp=temp->next;
list1->val<list2->val?list1=list1->next:list2=list2->next;
}
if(list1!=nullptr)temp->next=list1;
else if(list2!=nullptr)temp->next=list2;
return dummy->next;
}
};
还是,纸上得来终觉浅,绝知此事要躬行