两数相加
题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例如下:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路
- 链表
- 对两个链表进行遍历。若两个链表,其中一个链表较短,则补 0 当成相同链表进行操作。
- 计算时,需要考虑进位的问题,每次计算需要重新更新进位值。
- 若遍历结束,进位值为 1,则需要在返回新链表中的最前添加节点 1。
- 使用哑节点,可以跳过对空节点的检查。同时哑节点也充当预先指针,该指针的下一个节点指向真正的头结点 head。使用预先指针是为了防止链表构造移动指针时,导致指针丢失,无法返回结果。
代码实现
# 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:
# 定义哑节点,同时设预先指针
dummy = ListNode(0)
# 用于移动节点
cur = dummy
# 进位值
carry = 0
while l1 or l2: # 两链表为 null,遍历结束
# 判断节点,为 null 则补 0,
a = l1.val if l1 else 0
b = l2.val if l2 else 0
# 计算对应数之和
two_sum = a + b + carry
# 更新进位值
carry = two_sum // 10
# 移动节点
cur.next = ListNode(two_sum % 10)
cur = cur.next
if l1 != None:
l1 = l1.next
if l2 != None:
l2 = l2.next
# 进位值为 1,在最前添加节点 1
if carry > 0:
cur.next = ListNode(1)
# 返回哑节点下一个节点,为结果链表真正头结点
return dummy.next
实现效果
以上就是本篇的主要内容。