两数相加

题目介绍#

难度中等

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

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

你可以假设除了数字 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]

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

题解#

定义两个链表临时结点用于遍历链表。定义一个链表尾结点,尾节点指向末尾导数第二个结点。定义变量c存放进位。

遍历链表将两个临时结点的值相加并修改到l1链表中。如果两链表等长,则同时结束,如果l1链表长度大于l2链表长度,则l1与进位c相加的结果保存到l1中,如果l2链表长度大于l1链表长度,则l2与进位c相加的结果保存到l1中,此时l1需要创建新的结点(当然也可以之间将l2链表的结点连到l1链表后面)。

# 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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        p1 = l1
        p2 = l2
        tail = l1
        c = 0
        while p1 is not None and p2 is not None:
            val = p1.val + p2.val + c
            if val > 9:
                p1.val = val % 10
                c = 1
            else:
                p1.val = val
                c = 0
            tail = p1
            p1 = p1.next
            p2 = p2.next
        
        while p1 is not None:
            val = p1.val + c
            if val > 9:
                p1.val = val % 10
                c = 1
            else:
                p1.val = val
                c = 0
            tail = p1
            p1 = p1.next
        
        while p2 is not None:
            val = p2.val + c
            tail.next = ListNode()
            tail = tail.next
            p1 = tail
            if val > 9:
                p1.val = val % 10
                c = 1
            else:
                p1.val = val
                c = 0
            p2 = p2.next

        if c == 1:
            tail.next = ListNode()
            tail = tail.next
            p1 = tail
            p1.val = 1
        return l1
posted @   crazypigf  阅读(32)  评论(0编辑  收藏  举报
 
点击右上角即可分享
微信分享提示
主题色彩