题目如下:
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
代码:
# 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:
carry = 0
head = ListNode(0)
tempHead = head
while l1 != None or l2 != None:
x = l1.val if l1 else 0
y = l2.val if l2 else 0
s = x + y + carry
carry = s // 10
tempHead.next = ListNode(s%10)
tempHead = tempHead.next
if l1 != None:
l1 = l1.next
if l2 != None:
l2 = l2.next
if carry > 0:
tempHead.next = ListNode(1)
return head.next
此题讲究技巧性,其实原理蛮简单的,可能你会想到将两个链表的数相加求和再拆分成每一位数然后创建新的链表,但是时间复杂度肯定很高而且相加后是几位数也不确定,最好的办法就是每一位相加后直接生成一个结点,当然这少不了进位的计算即carry
,初始迭代carry
应为0,因为没有来自比个位还低的位数的进位,其余代码好说,关键在于tempHead.next=ListNode(s%10)
和最后的return head.next
,看到leetcode有很多网友问为什么最后返回的是head.next
而不是head
,这里head其实无用只是起到个占位的作用,如果让head作为链表的第一个结点即示例1的7,那么最后生成的链表必多出一个结点,这显然是错误的,所以这才有了tempHead.next=ListNode(s%10)
而不是tempHead.val=s%10
。