LeetCode2.两数相加

题目

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

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

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

示例

c 复制代码
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

思路

当我们需要将两个逆序表示的非负整数链表相加时,可以使用一个循环来遍历两个链表的每一位,并同时进行相加操作。在这个过程中,我们需要考虑进位的情况。

具体的思路如下:

  • 创建一个虚拟头节点 dummy,并用一个指针 cur 指向该节点。
  • 初始化一个变量 carry 用于存储进位值,初始值为 0。
  • 遍历两个链表 l1 和 l2 直到两个链表都到达末尾并且没有进位:
    • 计算当前位的和:当前位的值等于 l1 的节点值加上 l2 的节点值再加上进位值。
    • 更新进位值 carry:将当前和除以 10 得到的商作为新的进位值。
    • 创建一个新节点,其值为当前和对 10 取余的结果,将该节点连接到结果链表中。
    • 将指针 cur 移动到新节点。
    • 移动 l1 和 l2 指针到下一个节点。
  • 如果遍历结束后还存在进位值 carry,需要再创建一个新节点存储进位值。
  • 返回虚拟头节点 dummy 的下一个节点,即为相加后的链表。

Code:

c 复制代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode dummy(0);      // 创建一个虚拟头节点
        ListNode* cur = &dummy; // cur 指针指向虚拟头节点
        int carry = 0;          // 进位值初始化为 0

        while (l1 || l2 || carry) {
            int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
            carry = sum / 10;                   // 计算进位
            cur->next = new ListNode(sum % 10); // 创建新节点存储当前位的值
            cur = cur->next;

            if (l1)
                l1 = l1->next;
            if (l2)
                l2 = l2->next;
        }

        return dummy.next;
    }
};
相关推荐
ajassi20002 分钟前
开源 C++ QT Widget 开发(十五)多媒体--音频播放
linux·c++·qt·开源
焦耳加热33 分钟前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn41 分钟前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6061 小时前
常用排序算法核心知识点梳理
算法·排序
鹅毛在路上了2 小时前
C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览
c++·opencv·ffmpeg
John_ToDebug3 小时前
定制 ResourceBundle 的实现与 DuiLib 思想在 Chromium 架构下的应用解析
c++·chrome·ui
蒋星熠3 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油4 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream4 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL4 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法