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