445 两数相加 II(翻转链表、高精度加法)

30 篇文章 0 订阅

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值