Leetcode 02两数相加(c++和python)

本文介绍了一种解决链表加法问题的方法,即两个非空链表表示的非负整数相加,并返回一个新的链表作为结果。通过遍历两个链表,逐位相加并处理进位,最终生成结果链表。提供了C++和Python两种语言的代码实现。

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

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

C++代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * result = new ListNode(0);
        ListNode * cur = result;

        int x = 0, y = 0, carray = 0, total_val = 0, cur_val = 0;
        while (l1 != nullptr || l2 != nullptr)  // 只要有一个不为空,则继续
        {
            // 取值
            x = (l1 != nullptr) ? l1->val : 0;  // 有一个为空,则填0
            y = (l2 != nullptr) ? l2->val : 0;
            total_val = x + y + carray;

            // 更新当前节点val和进位
            cur_val = total_val % 10;  // 取余数
            carray = total_val / 10;  // 取整数

            // 插入新节点
            cur->next = new ListNode(cur_val);

            // 下一个节点
            if (l1) l1 = l1->next;  // 当前节点不空,则->next就不会报错
            if (l2) l2 = l2->next;
            cur = cur->next;
        }

        if (carray == 1)
            cur->next = new ListNode(carray);
        return result->next;

    }
};

补充:要对头结点进行操作时,考虑创建哑节点dummy,使用dummy->next表示真正的头节点。这样可以避免处理头节点为空的边界问题。 

python实现:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1, l2):
        result = cur = ListNode(0)
        carray = 0

        while l1 or l2:  # 只要有一个不空,则继续
            # 求和
            x = l1.val if l1 else 0  # 如果为空,说明长度不够,用0
            y = l2.val if l2 else 0  
            total_val = x + y + carray

            # 更新当前节点值和进位数
            cur_val = total_val % 10  # 余数
            carray = total_val // 10  # 取整
            
            # 插入当前节点
            cur.next = ListNode(cur_val)

            # 下一个
            if l1: l1 = l1.next
            if l2: l2 = l2.next
            cur = cur.next
        
        # l1和l2长度相同,且最后还有进位
        if carray == 1: cur.next = ListNode(carray)
        return result.next

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值