2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路:
这道题其实是个数学题,需要构造一个新的链表用于返回结果,数学加法操作就要考虑进位的问题,考虑进位运算,对每次遍历的两个链表的节点的数字进行相加,再看是否需要进位,每次对加和后的数字对10求商和余数,商用于进位,余数用于构造返回的结果链表使用,结果链表的数字正好也是反的,那就用一个指针指向下一个节点。具体实现看代码及注释。
代码实现:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# 需要考虑进位
bit = 0
# 申请一个新链表的表头的哑结点
res = ListNode(-1)
cur_node = res
while l1 or l2 or bit:
# 统计每次节点值
cur_num = 0
if l1:
cur_num += l1.val
l1 =l1.next
if l2:
cur_num += l2.val
l2 = l2.next
# 进位
if bit:
cur_num += bit
bit -= 1
# 对10 求商和余数
bit, cur_num = divmod(cur_num, 10)
# 构建结果链表
cur_node.next = ListNode(cur_num)
cur_node = cur_node.next
return res.next
参考文献:
https://leetcode-cn.com/problems/add-two-numbers/solution/2-liang-shu-xiang-jia-biao-zhun-de-lian-c85p9/