题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
例:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
方法
根据题目数字是按照逆序存储的,那么首尾即为各位,从左向右进行加法,若存在进位则加在下一个(右边)
- result 和 curr 分别指向链表的头节点,curr 指向当前节点
- carry 表示进位,初始为零
- 循环直至两个链表 l1 和 l2 均为空
- 若链表 l1 存在,那么将指向该节点的值赋值给 x;否则,赋值零
- 若链表 l2 存在,那么将指向该节点的值赋值给 y;否则,赋值零
- sum 表示两个节点加上进位 carry 的和
- 将该和 sum%10 存入当前节点的下一个节点处,取余数的原因是只能存储一位数,若和为两位数,那么只存储个位
- 更新进位 carry
- 为了进行下一步的加法,分别将 l1 和 l2 指向下一个节点
- 若在完成所有加法后,仍存在进位,那么此时应该将改进为加到下一个节点处
- 返回新链表
※ 由于 result 指向的是头节点,而头节点的下一个节点才为链表的第一个节点,所以需要返回 result.next
# 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):
result = curr = ListNode()
carry = 0
while l1 or l2:
if l1:
x = l1.val
else:
x = 0
if l2:
y = l2.val
else:
y = 0
sum = x + y + carry
curr.next = ListNode(sum%10)
carry = sum // 10
if l1:
l1 = l1.next
if l2:
l2 = l2.next
curr = curr.next
if carry:
curr.next = ListNode(carry)
return result.next
参考
代码相关:https://leetcode.cn/problems/add-two-numbers/solution/si-kao-guo-cheng-pythondai-ma-zhu-yi-by-4fl4i/
网友评论