目录
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
1.

输入: L1 = [1,2,4], L2 = [1,3,4]
输出:[1,1,2,3,4,4]
2.
输入: L1 = [], L2 = []
输出:[]
3.
输入: L1 = [], L2 = [0]
输出:[0]
思路分析
这道题用双指针法和递归法都可以
双指针法
即用两个指针同时遍历两个链表,比较两个指针所指节点的值大小,较小的节点的next指针指向较大的节点,然后移动指针继续比较
遍历直到其中一个指针为空为止,表示已经处理完了其中一个链表。这种方法用c/c++实现是很自然的,而对于Python用递归则更合适,下面详细介绍递归法
递归法
什么是递归呢?函数在运行时调用自己,这个函数就叫递归函数,调用的过程叫做递归
递归有两个规律:
- 递归函数必须要有终止条件,否则会出错;
- 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案
对于这道题:
终止条件 :当其中一个链表为空时,表示该链表已合并完成,return另一个链表(其实就是另一个链表剩下的直接拼接到尾部)
递归过程:判断 L1 和 L2 头节点哪个更小,然后较小结点的 next 指针指向其余节点的合并结果。(调用递归)
这里的递归过程这样理解:表面上来看是头节点连接上了后面已经合并过的有序链表(从上到下)
但程序运行实际是两个链表的尾节点先比较,大的放后面,这样的两个节点就组成了第一个最小的有序链表,然后return,上一层调用处接收到了这个有序链表,用同样的逻辑再进行比较(还是只比两个节点就行,因为后面已经有序了不用管),再return,最终得到整体的合并结果(从下到上)
还不理解的可以结合下面的代码进行理解
Python代码
python
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if not list1: return list2
if not list2: return list1
if list1.val <= list2.val:
list1.next = self.mergeTwoLists(list1.next, list2)
return list1
else:
list2.next = self.mergeTwoLists(list1, list2.next)
return list2
这里两个if not是终止条件,val的比较表示主递归过程
最后
极致简洁的代码 是Python的魅力