21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
链表的排序其实和数组差不多,而且感觉比数组的代码看起来更简单,这可能就是python的简单之处吧,不需要你重复的调用指针,只需要一个赋值操作就完成了指针。看下面的代码可以和之前我写的数组排序的代码结合看,其实一样。采用方法是双指针,时间复杂度:O(m+n),空间复杂度:O(1)–因为链表创建的临时变量只是一个指针,通过一个指针就可以访问完整的链表
# 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:
result= ListNode()#创建一个空链表,用来连接结点
res = result#创建临时指针指向上面的链表的头结点,最后要返回这个头结点的next,因为初始化的链表是一个val=0,next=None的结点
while l1 or l2:
if l1 == None and l2 != None:#注意判断是l1、l2,而不是l1.next,因为下面赋值了l1 = l1.next...
result.next = l2
l2 = l2.next
elif l2 == None and l1 != None:
result.next = l1
l1 = l1.next
elif l1.val < l2.val:
result.next = l1
l1 = l1.next
else:
result.next = l2
l2 = l2.next
result = result.next#返回result.next,而不是result,为什么你可以返回result试下结果就明白了
return(res.next)
另一个版本(意思是一样的):
# 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:
result= ListNode()
res = result
while l1 and l2:
# if l1.next == None and l2.next != None:
# result.next = l2
# l2 = l2.next
# elif l2.next == None and l1.next != None:
# result.next = l1
# l1 = l1.next
if l1.val < l2.val:
result.next = l1
l1 = l1.next
else:
result.next = l2
l2 = l2.next
result = result.next
result.next = l1 if l1 != None else l2
return(res.next)
递归实现,递归就是有点绕脑子,这里也不太好解释,看代码
# 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:
#递归
#这2个判断语句用来终止循环
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