给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
链表开头为数字的最后一位,所以可以直接从链表开头对两个链表的对应位置数字相加,余数保留,商加到下一位即可。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
curNode = ListNode(0)
result = curNode
carry = 0
while carry or l1 or l2:
carry, m = divmod(carry + (l1.val if l1 else 0) + (l2.val if l2 else 0), 10)
if not curNode:
curNode.val = m
else:
curNode.next = ListNode(m)
curNode = curNode.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return result.next
技巧:
- divmod函数的应用:该函数可以对两个数相除,同时返回商和余数。e.g. divmod(7, 2) ==> (3,1)
分析:
该方法仅需要遍历链表一次即可实现两个链表相加,所以时间复杂度为O(n);
需要一个长度为n(两个链表中较长的一个)或n+1的链表存储最终的结果O(n),还需要一个长度为1的节点存储进位O(1),所以空间复杂度为O(n)