先如1所示自己试着写了一下,但是为什么我的时间效率只能超过百分之70的人啊,复制了更快的答案在2中。这个算法的时间复杂度是O(max(N, M)),空间复杂度是O(max(M, N))。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers1(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = new = ListNode()
carry = 0
while l1 or l2:
val1, val2 = 0, 0
if l1:
val1 = l1.val
l1 = l1.next
if l2:
val2 = l2.val
l2 = l2.next
tmp = val1 + val2 + carry
carry = tmp // 10
value = tmp % 10
new.next = ListNode(value)
new = new.next
if carry:
new.next = ListNode(carry)
return dummy.next
def addTwoNumbers2(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历
dummy = p = ListNode(None)
s = 0 # 初始化进位 s 为 0
while l1 or l2 or s:
# 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)
s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
p.next = ListNode(s % 10) # p.next 指向新链表, 用来创建一个新的链表
p = p.next # p 向后遍历
s //= 10 # 有进位情况则取模, eg. s = 18, 18 // 10 = 1
l1 = l1.next if l1 else None # 如果l1存在, 则向后遍历, 否则为 None
l2 = l2.next if l2 else None # 如果l2存在, 则向后遍历, 否则为 None
return dummy.next # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点
PREVIOUSmq021.整数转换英文表示
NEXTlc415.字符串相加