问题描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0
之外,这两个数都不会以 0
开头。
示例 :
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
问题分析:
先看问题,题目已经给出很多限制条件,例如非负数整数等,这就少考了虑很多因素。题目给出的链表存储的整数,且,整数是逆序存储的,反正更容易计算,因为我们可以从左至右,也就是从个位开始,对应位置相加即可,然后每一位相加的结果,按照链表的尾插法,依次插入新的链表,即可。
具体的解决过程如下:
(1)while
循环遍历链表L1
、L2
,把对应位置求和
,再加上,上一位的进位
情况。把最后的求和值,进行拆分
,分为当前位置保留值
,和进位值
。依次循环直至结束。
(2)如果其中一个链表为空,不能与另外一个链表一一对应,怎么办?为空的可以赋值为 0
。
(3)注意
:最后while
循环结束之后,要考虑最后一次求和的进位情况
。
Python3实现:
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
carry = 0 # 进位
notehead = ListNode(0)
curr = notehead
while (l1 != None or l2 != None):
n = l1.val if l1 != None else 0 # 获取当前位置的值,如果为空则设置为0
m = l2.val if l2 != None else 0
sum = carry + n + m # 相同位置的和,然后加上进位
carry = int(sum / 10) # 求要进位的值
curr.next = ListNode(sum % 10) # 求当前位置的值(进位之后剩下的值)
curr = curr.next
if (l1 != None): l1 = l1.next # 移动到下一位
if (l2 != None): l2 = l2.next
if carry > 0: # 最后判断是否进位
curr.next = ListNode(carry)
return notehead.next
if __name__ == '__main__':
l1 = ListNode(9)
l1.next = ListNode(3) # l1: 9->3, 39
l2 = ListNode(8)
l2.next = ListNode(4) # l2: 8->4, 48
solu = Solution()
res = solu.addTwoNumbers(l1, l2) # l1+l2=39+48=87, 7->8
outarr = [] # 测试 验证结果
while res != None:
outarr.append(res.val)
res = res.next
print('->'.join([str(v) for v in outarr]), ' :', ''.join([str(v) for v in outarr][::-1]))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。
题目链接: https://leetcode-cn.com/problems/add-two-numbers/