力扣刷题(两数相加)

发布时间:2024年01月14日

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

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

你可以假设除了数字 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]
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 创建一个虚拟节点作为结果链表的头节点
        ListNode *dummy = new ListNode(0);
        // 创建一个指针来追踪当前节点
        ListNode *cur = dummy;
        // 初始化进位值为0
        int carry = 0;
        
        // 当l1、l2不为空或者还有进位值时进行循环
        while (l1 || l2 || carry) {
            // 获取l1当前节点的值,如果l1为空则为0
            int i1 = l1 ? l1->val : 0;
            // 获取l2当前节点的值,如果l2为空则为0
            int i2 = l2 ? l2->val : 0;
            // 计算当前位的和以及进位值
            int add = i1 + i2 + carry;
            // 根据和的大小更新进位值
            carry = add >= 10 ? 1 : 0;
            // 如果和大于等于10,则更新和为和减去10
            add = add >= 10 ? add - 10 : add;
            // 创建一个新节点,值为和
            cur->next = new ListNode(add);
            // 将当前指针移动到下一个节点
            cur = cur->next;
            
            // 如果l1不为空,则将l1指针移动到下一个节点
            if (l1) {
                l1 = l1->next;
            }
            // 如果l2不为空,则将l2指针移动到下一个节点
            if (l2) {
                l2 = l2->next;
            }
        }
        
        // 返回虚拟节点的下一个节点,即为结果链表的头节点
        return dummy->next;
    }
};

文章来源:https://blog.csdn.net/m0_59001573/article/details/135587756
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。