1使用循环
#class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param l1 ListNode类
# @param l2 ListNode类
# @return ListNode类
#
class Solution:
def mergeTwoLists(self , l1 , l2 ):
#分别判断两个链表是否为空
if not l1:
return l2
if not l2:
return l1
#以下处理两个链表都不为空的情况,
ret = l1 if l1.val<=l2.val else l2 #以较小的作为新链表的起使
l=ret #新链表的游标
#移动已加入新链表的l1或者l2链表,避免重复
cur1=l1 if ret is l2 else l1.next
cur2=l2 if ret is l1 else l2.next
while cur1 or cur2:
#取到各游标当前值,只会出现一个游标是空的情况,为空赋值另一个游标当前值加一,保证该值不会使用
val1 = cur1.val if cur1 else cur2.val+1
val2 = cur2.val if cur2 else cur1.val+1
if val1<=val2:
l.next = cur1
l = l.next
cur1 = cur1.next
else:
l.next = cur2
l = l.next
cur2 = cur2.next
#链表最后需要指向空
l.next = None
return ret 递归算法:比较当前链表的值,较小的取其子链表继续递归。
当有一个链表取到子链表为空时,说明已经比较完成,可以直接返回非空的链表,返回值赋给了l1.next或者l2.next,但无论如何,最终还是沿着递归链不断返回,最终返回的是新有序链表的表头。
class Solution:
def mergeTwoLists(self , l1 , l2 ):
#递归退出条件
if not l1 or not l2:
return l1 if l1 else l2
if l1.val<=l2.val:
l1.next=self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next=self.mergeTwoLists(l1, l2.next)
return l2


京公网安备 11010502036488号