[Algorithm] C++ 两数相加

68 阅读1分钟

1. 每日一题

给定两个用链表表示的非负整数,每个节点包含一个数字,这些数字是反向存储的,即个位数字在链表头部。请你将这两个数相加,并以链表形式返回结果。

示例:
输入:(9 -> 1 -> 6) + (5 -> 9 -> 2),即 617 + 295
输出:2 -> 1 -> 9,即 912
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4),即 342 + 465
输出:7 -> 0 -> 8,即 807

struct ListNode{
    int val;
    ListNode* next;
    ListNode():val(0), next(nullptr){}
};

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* dummyHead = new ListNode(0);
    ListNode* current = dummyHead;
    int carry = 0;

    while (l1 != nullptr || l2 != nullptr || carry > 0) {
        int val1 = (l1 != nullptr) ? l1->val : 0;
        int val2 = (l2 != nullptr) ? l2->val : 0;
        int total = val1 + val2 + carry;

        carry = total / 10; // 计算进位
        current->next = new ListNode(total % 10); // 创建新节点
        current = current->next; // 移动到下一个节点

        if (l1 != nullptr) l1 = l1->next; // 移动链表 l1
        if (l2 != nullptr) l2 = l2->next; // 移动链表 l2
    }

    return dummyHead->next; // 返回结果链表的头节点
}