编程练习系列- addTwoNumbers实现

博客介绍了使用Python处理链表的思路,通过创建新链表,对对应位置节点的值域求和并取余,同时考虑进位情况,涉及LeetCode算法相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路:创建一个新的链表,将对应位置的节点的值域进行求和(取余),要考虑到进位(整除部分)

from typing import List

# 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: ListNode, l2: ListNode) -> ListNode:
        dst = cur = ListNode()  # 初始化一个dst目标链表。cur临时链表,用于指向目标链表的尾部。
        carry = 0  # 进位数
        while l1 or l2:
            sum = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry  # 链表对应节点相加,进位也要考虑到,当任意一个链表遍历完后,补0
            if sum >= 10:  # 当和大于等于10时,更新进位数和sum
                carry = int(sum / 10)  # 10的整数部分
                sum = sum % 10  # 10的余数部分
            else:
                carry = 0  # 和小于10时,进位数为0
            cur.next = ListNode(sum)  # 定义节点并赋值,临时链表的指针指向新节点
            cur = cur.next  # 更新临时链表的表头,即将临时节点指针指向目标节点的尾部
            # 表头指向下一个节点
            if l1: l1 = l1.next
            if l2: l2 = l2.next

        if carry != 0:  # 当完成链表遍历后,进位数不为0时,新建节点放到目标链表的尾部
            cur.next = ListNode(carry)
        return dst.next

    '''
    创建链表
    思路:
    首先:初始化一个目标链表,并将链表赋值给临时链表; 
    接着:遍历列表,新建节点,存储数值;
    然后:将节点赋值给临时链表的下一个节点;
    最后:更新临时链表的指针,指向目标链表的尾部.
    依次类推,完成列表的创建
    '''
    def createList(self, nums: List[int]):
        dst = cur = ListNode()  # 初始化dst节点,作为目标链表,cur用来记录目标链表的尾部节点指针
        for i in nums:
            cur.next = ListNode(i)  # 将节点存到cur链表的尾部
            cur = cur.next  # 更新为最新的尾部节点指针
        return dst.next

if __name__ == '__main__':
    aa = [9, 9, 9, 9]
    bb = [5, 6, 4]
    myfun = Solution()
    list1 = myfun.createList(aa)
    list2 = myfun.createList(bb)

    result = myfun.addTwoNumbers(list1, list2)
    print("hello")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值