leetcode算法

leetcode链表之两数相加

2022-03-18  本文已影响0人  小奚有话说

2、两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:


输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 = 807.

示例2:


输入:l1 = [0], l2 = [0]

输出:[0]

示例3


输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

输出:[8,9,9,9,0,0,0,1]


思路

由于两个链表都是逆序方式存储数字的,可以遍历两个链表,同一位置的两个数据直接相加,类似于我们日常的加法运算。

代码:


class Solution:

    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:

        sum, carry = 0, 0

        # 这里的head是为了存储根节点,后面进行返回

        cur = head = ListNode()

        while l1 or l2 or carry:

            sum = carry

            if l1:

                sum = sum + l1.val

                l1 = l1.next

            if l2:

                sum = sum + l2.val

                l2 = l2.next

            # 判断是否有进位

            carry = sum // 10

            cur.next = cur = ListNode(sum % 10) # 这里是地址引用

            # 类似于

            # cur.next = ListNode(sum % 10)

            # cur = cur.next

        # 由于根节点是一个空节点,所以这里需要返回根节点的下一个结点

        return head.next

445、两数相加

题目:

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:


输入:l1 = [7,2,4,3], l2 = [5,6,4]

输出:[7,8,0,7]

示例2:


输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[8,0,7]

示例3:


输入:l1 = [0], l2 = [0]

输出:[0]


思路:

先将两个链表反转,然后进行相加,最后将得到的结果反转过来即可


class Solution:

    def reversed(self, head:ListNode) -> ListNode:

        prev, cur = None, head

        while cur:

            next = cur.next

            cur.next = prev

            prev = cur

            cur = next

        return prev

    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:

        if not l1 or not l2: return l1 or l2

        # 将l1和l2链表反转

        l1 = self.reversed(l1)

        l2 = self.reversed(l2)

        cur = vHead = ListNode()

        sum = carry = 0

        # 循环相加

        while l1 or l2 or carry:

            sum = carry

            if l1:

                sum += l1.val

                l1 = l1.next

            if l2:

                sum += l2.val

                l2 = l2.next

            carry = sum // 10

            cur.next = ListNode(sum % 10)

            cur = cur.next

        # 将得到的结果进行反转

        return self.reversed(vHead.next)

上一篇 下一篇

猜你喜欢

热点阅读