21.合并两个有序链表
法一:超时
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
r=head=l1
while l1!=None and l2!=None:
if l1.val<=l2.val:
r.next=l1
l1=l1.next
else:
r.next=l2
l2=l2.next
r=r.next
if l1==None:
r.next=l1
if l2==None:
r.next=l2
return head
法一改进:
1、对两个链表判空(超时的关键)
2、先比较再赋值。
36 ms 14.9 MB
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1==None:
return l2
if l2==None:
return l1
if l1.val<=l2.val:
r=head=l1
l1=l1.next
else:
r=head=l2
l2=l2.next
while l1!=None and l2!=None:
if l1.val<=l2.val:
r.next=l1
l1=l1.next
else:
r.next=l2
l2=l2.next
r=r.next
if l1==None:
r.next=l2
if l2==None:
r.next=l1
return head
上述改进代码行数多,因此可直接新建一个空节点作为头节点,最后返回head.next
即可
44 ms 15 MB
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
r=head=ListNode()
while l1!=None and l2!=None:
if l1.val<=l2.val:
r.next=l1
l1=l1.next
else:
r.next=l2
l2=l2.next
r=r.next
if l1==None:
r.next=l2
if l2==None:
r.next=l1
return head.next
法二:递归算法,性能较差。
56 ms 14.9 MB
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 and l2:
if l1.val>l2.val:
l1,l2=l2,l1
l1.next=self.mergeTwoLists(l1.next,l2)
return l1 or l2