1. 题目地址
2. 题目描述
- 英文描述
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse
order and each of their nodes contain a single digit.
Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0
itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
- 中文描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因:342 + 465 = 807
3. 解题思路
我们要注意,题目中一共有两个关键点:
- 位数是逆序存储的
- 相加后返回新链表(新链表表示它们的和,仍然以逆序存储)
这在很大程度上方便了我们的计算,因为它们各自的位数是按照逆序的方式存储的,也就是说头节点所表示的就是其所代表数字的个位数,按照两数相加时个位为准、各位对其的原则,我们就省略了判断两个链表各自位数长短的问题。如果是以正序方式存储,我们就必须考虑位数问题以及对齐的问题。
- 头节点代表个位数,从头节点开始依次相加
- 相加过程中会遇到进位的问题,所以需要设立一个表示进位的变量
上图中,每个节点包含一个数字,且数字按位逆序存储。
解题过程:
1. 设立一个表示进位的变量carry
2. 建立一个新链表,把输入的两个链表从头往后同时相加
3. 每两个对应位相加,将结果加上carry的值作为一个新节点,加入到新链表后面
4. 解题关键
- 要熟悉链表这种数据结构的特点
- 用carry变量来记录进位值,每次相加后计算carry用于下一位的计算
5. 示例代码
python
import os
import sys
class Solution:
def addTwoNumbers(self, l1, l2):
"""
l1: ListNode
l2: ListNode
"""
# 先判断l1和l2是否为空
if not l1:
return l2
if not l2:
return l1
head = ListNode(0)
l = head
carry = 0
# 当两个链表都是空,而且也没有进位的时候,就退出循环
while l1 or l2 or carry:
# 将进位传给result,然后进位清零
result, carry = carry, 0
if l1:
result += l1.val
l1 = l1.next
if l2:
result += l2.val
l2 = l2.next
if result > 9:
carry = 1
result -= 10
# 创建一个新的节点
l.next = ListNode(result)
l = l.next
return head.next