题集链接:https://leetcode.cn/problem-list/2cktkvj/
题目链接:https://leetcode.cn/problems/add-two-numbers/?favorite=2cktkvj
一、题目
题集链接:https://leetcode.cn/problem-list/2cktkvj/
题目链接:https://leetcode.cn/problems/add-two-numbers/?favorite=2cktkvj
一、题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
提示:
-
每个链表中的节点数在范围
[1, 100]
内
-
0 <= Node.val <= 9
-
题目数据保证列表表示的数字不含前导零
二、代码
解法1:循环
两个指针同时遍历两个链表每个节点并相加
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
dummy = ListNode(0) #构造虚拟节点
cur = dummy #当前节点指向虚拟节点
carry = 0 #记录进位
while l1 or l2 or carry:
i1 = l1.val if l1 else 0
i2 = l2.val if l2 else 0
add = i1 + i2 + carry
carry = 0 if add<10 else 1
add = add if add<10 else add-10 #完成计算
cur.next = ListNode(add) #指针后移
cur = cur.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
解法2:递归
递归函数定义:addTwoNumbers 表示将两个链表 l1 和 l2 相加得到的新链表
递归终止条件:如果 l1 和 l2 有一个为空,则返回另外一个
递归函数内容:
把两个链表节点的值相加(结果记为 add ),把 add 模 10 作为当前的链表节点的值
把两个链表的 next 节点相加(如果当前相加的结果 add>=10,需要把 next节点相加得到的结果 + 1)
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
if l1 is None:
return l2
if l2 is None:
return l1
add = l1.val + l2.val
res = ListNode(add%10)
res.next = self.addTwoNumbers(l1.next, l2.next)
if add >= 10:
res.next = self.addTwoNumbers(res.next, ListNode(1))
return res
三、总结
参考资料:https://leetcode.cn/problems/add-two-numbers/solutions/1058444/fu-xue-ming-zhu-xiang-jie-qiu-jia-fa-xun-6bah/?languageTags=python
-
理解
dummy node
-
if not 判断是否为None
注意!!!
不可以把链表先转化成 int 型数字再求和,因为可能溢出
两个「加数」的字符串长度可能不同
在最后,如果进位 carry 不为 0,那么最后需要计算进位