21. 合并两个有序链表
1.题目
2.我的解决方案
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1 and not l2:
return
l3 = ListNode()
cur1 = l1
cur2 = l2
cur3 = l3
while cur1 and cur2:
if cur1.val < cur2.val:
cur3.val = cur1.val
cur1 = cur1.next
else:
cur3.val = cur2.val
cur2 = cur2.next
node = ListNode()
cur3.next = node
cur3 = cur3.next
while cur1 and cur1.next:
cur3.val = cur1.val
cur1 = cur1.next
node = ListNode()
cur3.next = node
cur3 = cur3.next
while cur2 and cur2.next:
cur3.val = cur2.val
cur2 = cur2.next
node = ListNode()
cur3.next = node
cur3 = cur3.next
if cur1:
cur3.val = cur1.val
if cur2:
cur3.val = cur2.val
return l3
- 时间复杂度:
O
(
n
)
O(n)
O(n)
- 空间复杂度:
O
(
n
)
O(n)
O(n)
3. 官方的解决方案
3.1 递归
- 反思:代码比我的简洁,也没有定义第三个结果数组,至于最后返回的是l2还是l1完全是由程序的运行情况自己决定的
class Solution:
def mergeTwoLists(self, l1, l2):
if l1 is None:
return l2
elif l2 is None:
return l1
elif l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
- 时间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n)
- 空间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n)
3.2 迭代
- 定义一个头结点
- 根据l1和l2的结点数值大小向头节点后面延申,但是不用重新再开辟空间
class Solution:
def mergeTwoLists(self, l1, l2):
prehead = ListNode(-1)
prev = prehead
while l1 and l2:
if l1.val <= l2.val:
prev.next = l1
l1 = l1.next
else:
prev.next = l2
l2 = l2.next
prev = prev.next
prev.next = l1 if l1 is not None else l2
return prehead.next
- 时间复杂度:
O
(
m
+
n
)
O(m+n)
O(m+n)
- 空间复杂度:
O
(
1
)
O(1)
O(1)