21、合并两个有序列表
题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100l1和l2均按 非递减顺序 排列
解析过程:
1、将两个链表合成一个链表,有很多种方式,比如将链表的值取出来放入列表中,进行排序,再封装成链表,但效率太低了;又比如说循环迭代,效率比较高,代码也比较简单;可是也能用递归完成,何不练练手?
2、那么用递归的方式解决一下。
3、第一个问题,递归的终止条件是什么?由于两条链都是升序,很明显,当两条链其中一条链到递归到底了就可以终止递归了。
4、第二个问题,递归返回值是什么?可以结合第三个问题看一下,就知道递归应该返回值小的那条链。
5、第三个问题,本级递归(看第一级就可以了)该做什么?应该比较两条链头节点的大小,再将值小的链的下一个节点拿去和值大的比较。
6、到此递归三大问题就被解决了,即可赋上当代码。
附上代码:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//递归法
if (l1 == null) {//l1递归到底,那么返回l2,并终止递归
return l2;
}
else if (l2 == null) {//l2递归到底,那么返回l1,并终止递归
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;//返回值小的那条链
}
}
总结:
递归解题三要素:找终止条件、找返回值、本级递归应该做什么。

浙公网安备 33010602011771号