目录
题目描述
给出两个非空的(单向)链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示他们的和。您可以假设除数字0以外,这两个数都不会以0开头。
输入/输出示例
指定两个相加的整数 | 342, 465 |
得到的结果 | [ 8, 0, 7] |
解释 | 因为 2 + 5 = 7; 4 + 6 = 10, 进位后得0; 3 + 4 + 1(进位)= 8 |
解决方案
因为两个链表是单向链表,且是从个位数开始至最高位存储的每一个数字,因此依次对两个链表的每一位做加法即可。
在做加法的时候需要注意一点,如果两个数相加超过了9,必须向更高位进位,即高位+1。如果高位+1后继续大于9,重复进位,直至小于10。
需要考虑的一点是,两个数长度不相等的情况。如果number1长度大于number2,则只需要考虑number1后面节点所保存的数字有没有大于9的,有则进位;如果number2的长度大于number1,则只需要将number1的尾指针指向number2后续的节点即可。
解决方案大概有两种
第一种:在原有链表上做加减
第二种:创建新的链表保存结果
代码
方案一:在原有链表上做加减
这种方案是最节省空间消耗的。即在原链表的基础上保存相加后的结果,最小限度的开辟新节点。需要注意的是该方法会破坏一个链表的原有数据。
# 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:
head = l1
while True:
add = l1.val + l2.val
if add >= 10:
l1.val = add - 10
if l1.next is None:
node = ListNode(1)
l1.next =