题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
注意两个链表按照非递减顺序排列
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
思路:
方法1,迭代
先构造一个链表,用来放合并后的节点,循环遍历两个链表,取小的那个节点放在结果链表头节点的后面,同时结果指针指向下一节点,用于后面接着往后放,当两个链表有一个为空时,跳出循环,这时结果链表中的节点肯定都小于或者等于剩下那个不是空的链表中的节点,所以可以直接在结果链表后面加上这一部分,最后返回结果链表,从合并的节点开始。
方法2,递归
递归就是函数不断调用自身的过程,有终止条件,遇到终止条件就开始回溯,最终返回答案。想象函数f(x)=x+f(x-1)的计算过程。
这里递归的过程是,比较两个链表的当前节点,看哪个小,用小的那个后边接剩下所有部分,后边部分还按照规则合并,就是调用原函数的过程,直到终止条件是其中一个链表是空的了,我们返回另外一个,这样前面那个小的就指向了后面这一串,这一层的函数执行结束,返回这一层递归的头节点,然后往前回溯,最终返回结果链表。
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
# 迭代
# anshead = ListNode(-1)
# ans = anshead
# while l1 and l2:
# if l1.val <= l2.val :
# ans.next = l1
# l1 = l1.next
# else :
# ans.next = l2
# l2 = l2.next
# ans = ans.next
# if l1 is not None:
# ans.next = l1
# else:
# ans.next = l2
# return anshead.next
# 递归
if not l1:return l2
if not l2:return l1 #有一个是空的就返回,终止递归
if l1.val <= l2.val:
l1.next = self.mergeTwoLists(l1.next,l2)
return l1 #更新当前这一层里的头节点
else:
l2.next = self.mergeTwoLists(l1,l2.next)
return l2