1. 问题描述:
给你两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
2. 思路分析:
分析题目可以知道给出的两个链表都是以高位开始存储的,而我们相加的时候是从低位开始相加的,所以一开始的时候我们需要先翻转一下两个链表(翻转链表可以借助于三个变量翻转,修改指针指向即可,画图会很好理解),然后模拟链表的每一位相加的过程即可,这里可以借助于高精度加法的思路即可。
3. 代码如下:
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
# 返回翻转之后链表头结点
def reverse(self, h: ListNode):
head = h
a, b = h, h.next
while b:
c = b.next
b.next = a
a = b
b = c
# 最开始的头结点为空
head.next = None
return a
# 先翻转两个链表才能够相加, 然后使用高精度加法的模板
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
l1 = self.reverse(l1)
l2 = self.reverse(l2)
# 高精度加法
# t表示进位
# head表示虚拟节点这样方便后面的时候修改指针指向
head = ListNode(-1)
t = 0
while l1 or l2 or t:
if l1:
t += l1.val
l1 = l1.next
if l2:
t += l2.val
l2 = l2.next
cur = ListNode(t % 10)
t //= 10
# 在插入创建的节点使用头插法插入节点这样后面就可以不用翻转了
cur.next = head.next
head.next = cur
return head.next