将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
两个链表用列表表示,即list1和list2,这既是链表名也是链表的头指针,我们可以使用双指针加循环方式,设置一个结果链表,并设置一个指针 p 指向结果链表,同时遍历两个链表比较当前俩个链表指针指向的值,若list1指向的值小,则将 p -> next 指向这个值,然后将list1指针后移一位继续比较,直到有一个链表为空,直接将另一个链表加入结果链表即可。
需要注意的是,考虑有链表初始为空的情况,此时直接返回另一个链表即可。
代码:
class Solution(object):
def mergeTwoLists(self, list1, list2):
#非递归方法
#存放结果
result = ListNode()
#定义一个指针
p = result
#判断list1是否为空
if list1 == None:
return list2
#判断list2是否为空
if list2 == None:
return list1
while list1 != None and list2 != None:
#比较当前两个结点大小
if list1.val < list2.val:
#将list1当前结点作为结果
p.next = list1
list1 = list1.next
else:
p.next = list2
list2 = list2.next
p = p.next
#判断有链表是否遍历完
if list1 != None:
p.next = list1
if list2 != None:
p.next = list2
return result.next
运行:
#存放结果
result = ListNode()
#定义一个指针
p = result
我们定义结果链表使用的leetcode内部的定义方法,所以不能直接在python中直接运行,可以将代码在leetcode上直接运行。
上面所用的方法是非递归的方法,因为两个链表是有序的,我们可以考虑递归的方法。当我们比较完当前指针指向的值,就将剩下的与另一条链表继续调用此方法比较。
代码:
class Solution(object):
def mergeTwoLists(self, list1, list2):
#递归方法
#判断list1是否为空
if list1 == None:
return list2
#判断list2是否为空
if list2 == None:
return list1
#比较两个链表当前指针指向值的大小
if list1.val < list2.val:
#list1当前值较小,就将list1剩余部分与list2比较
list1.next = self.mergeTwoLists(list1.next, list2)
return list1
else:
#list2当前值较小,就将list2剩余部分与list1比较
list2.next = self.mergeTwoLists(list1, list2.next)
return list2
运行说明:
“ListNode” is not defined
leetcode自定义类型,其定义可仿照下面链接进行自定义。
https://leetcode.cn/circle/article/s3RcOW/
https://blog.csdn.net/lesliezc/article/details/119189966