lc002.两数相加 Leetcode linkedList Dec 06, 2020 题目链接 先如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.字符串相加