力扣100题-2-两数相加

本文介绍了如何使用C++实现一个函数,计算两个逆序存储的链表中的数字之和。通过先反转链表,然后逐位相加并处理进位,最后返回结果链表。给出了一个具体的示例代码和执行过程。
摘要由CSDN通过智能技术生成

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

下面是一个用 C++ 实现的示例代码:
#include <iostream>
#include <vector>

using namespace std;

// 链表节点定义
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

// 反转链表
ListNode* reverseList(ListNode* head) {
    ListNode* prev = NULL;
    ListNode* curr = head;
    while (curr!= NULL) {
        ListNode* nextTemp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

// 计算两个链表的和并返回结果链表
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    // 反转两个链表
    ListNode* l1Rev = reverseList(l1);
    ListNode* l2Rev = reverseList(l2);

    // 初始化结果链表的头节点和进位
    ListNode* dummy = new ListNode(0);
    ListNode* curr = dummy;
    int carry = 0;

    // 遍历两个反转后的链表
    while (l1Rev!= NULL && l2Rev!= NULL) {
        int x = l1Rev->val + l2Rev->val + carry;
        carry = x / 10;
        curr->next = new ListNode(x % 10);
        curr = curr->next;
        l1Rev = l1Rev->next;
        l2Rev = l2Rev->next;
    }

    // 如果 l1 还有剩余的数字
    while (l1Rev!= NULL) {
        int x = l1Rev->val + carry;
        carry = x / 10;
        curr->next = new ListNode(x % 10);
        curr = curr->next;
        l1Rev = l1Rev->next;
    }

    // 如果 l2 还有剩余的数字
    while (l2Rev!= NULL) {
        int x = l2Rev->val + carry;
        carry = x / 10;
        curr->next = new ListNode(x % 10);
        curr = curr->next;
        l2Rev = l2Rev->next;
    }

    // 删除结果链表的头节点
    ListNode* result = dummy->next;
    delete dummy;
    return result;
}

int main() {
    // 示例输入
    ListNode* l1 = new ListNode(2);
    l1->next = new ListNode(4);
    l1->next->next = new ListNode(3);

    ListNode* l2 = new ListNode(5);
    l2->next = new ListNode(6);
    l2->next->next = new ListNode(4);

    // 计算两个链表的和
    ListNode* sum = addTwoNumbers(l1, l2);

    // 打印结果链表
    ListNode* curr = sum;
    while (curr!= NULL) {
        cout << curr->val << " ";
        curr = curr->next;
    }
    cout << endl;

    return 0;
}
在这个示例中,我们首先定义了两个链表节点的结构体 ListNode,以及一个用于反转链表的函数 reverseList。然后,我们定义了一个函数 addTwoNumbers,用于计算两个链表的和,并返回结果链表。
在 addTwoNumbers 函数中,我们首先将两个链表进行反转,然后使用迭代的方式将两个反转后的链表的数字逐位相加,并处理进位。最后,我们删除结果链表的头节点,并返回结果链表。
在 main 函数中,我们创建了两个示例链表 l1 和 l2,并调用 addTwoNumbers 函数计算它们的和。最后,我们打印结果链表。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值