当前位置:首页 > 力扣 > 力扣第二题详解:模拟竖式加法,链表操作如此简单

力扣第二题详解:模拟竖式加法,链表操作如此简单

9个月前 (05-16)

题目要求将两个非负整数以链表形式相加,并以相同形式的链表返回结果。两个链表中的每个节点代表一个数字位,且链表中的数字是逆序存储的(例如,数字 123 对应的链表为 3 -> 2 -> 1)。我们需要计算它们的和,并以相同的逆序链表形式返回。问题的核心在于模拟竖式加法,正确处理进位,并处理两个链表长度不同的情况。

力扣第二题详解:模拟竖式加法,链表操作如此简单 力扣 链表 迭代 模拟 第1张

解题思路与过程

1‌.哑节点简化操作‌
使用一个哑节点(head)作为新链表的起点,避免处理头节点的边界条件。

‌2.遍历链表并逐位相加‌
同时遍历两个输入链表,若其中一条链表已经遍历结束,则用值为 0 的节点代替,确保位数对齐。

3‌.处理进位‌
每次计算当前位的和时,需加上前一位的进位值 a,并更新新的进位值。

4‌.动态扩展结果链表‌
每次迭代生成一个新节点保存当前位的计算结果,并将其链接到结果链表中。

‌5.终止条件‌
当两条链表均遍历结束且进位值为 0 时,终止循环。

代码:

class Solution {  
public:  
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {  
        ListNode* head = new ListNode;       // 创建哑节点作为结果链表的起点  
        ListNode* head1 = head;              // 保存哑节点指针,用于最终返回结果  
        int a = 0;                           // 进位值初始化为0  
        while (l1 || l2 || a != 0) {         // 当链表未遍历完或仍有进位时继续  
            if (!l1) {                       // 若 l1 已结束,补零以对齐位数  
                l1 = new ListNode(0);  
            }  
            if (!l2) {                       // 若 l2 已结束,补零以对齐位数  
                l2 = new ListNode(0);  
            }  
            ListNode* node = new ListNode;   // 创建新节点保存当前位的结果  
            head->next = node;               // 将新节点链接到结果链表  
            node->val = (l1->val + l2->val + a) % 10;  // 计算当前位的值  
            a = (l1->val + l2->val + a) / 10;          // 更新进位值  
            head = head->next;               // 移动结果链表指针  
            l1 = l1->next;                   // 移动 l1 指针  
            l2 = l2->next;                   // 移动 l2 指针  
        }  
        return head1->next;                  // 返回哑节点的下一个节点(即实际结果)  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

【牛客227题解析】合并K个有序链表的优先队列解法(附代码)

【牛客227题解析】合并K个有序链表的优先队列解法(附代码)

一、题目解读牛客227题要求合并K个有序链表,即将多个有序的单向链表合并成一个有序链表。题目考察的核心是对链表操作的熟练度以及高效算法的设计,通常需要平衡时间复杂度和空间复杂度,确保合并过程稳定且高效...

力扣LCR022题解析:链表环检测算法与代码实现(快慢指针法深度剖析)

力扣LCR022题解析:链表环检测算法与代码实现(快慢指针法深度剖析)

一、题目解读LCR022题要求判断给定的链表中是否存在环,若存在则返回环的入口节点。该问题属于链表经典算法题,核心在于如何高效识别环的是否存在及定位入口点。题目考察对链表结构和循环特性的理解,需避免暴...

【牛客234288题解析】前缀计算与迭代查找第K个数:高效求解不含前导零的序列元素

【牛客234288题解析】前缀计算与迭代查找第K个数:高效求解不含前导零的序列元素

一、题目解读牛客234288题要求在一个由1到n的数字组成的序列中,找到第K个不含前导零的数。例如,当n=12时,序列为[1,2,3...12],若K=5,则答案为5。题目关键在于避免暴力生成所有数字...

洛谷P1162题:模拟算法解决约瑟夫环报数

洛谷P1162题:模拟算法解决约瑟夫环报数

一、题目解读洛谷P1162题要求模拟一个报数游戏:有N个人围成一圈,从1开始依次报数,当报到包含数字7或7的倍数时,方向反转(即顺时针变为逆时针,或反之)。题目需要求解第X次报数的人编号。关键在于处理...

牛客BM11题解析:链表相加的栈解法

牛客BM11题解析:链表相加的栈解法

一、题目解读牛客BM11题要求实现两个链表的相加操作,即将两个链表对应节点的值相加,并返回相加后的结果链表。题目考察的核心在于如何处理链表的逆序相加与进位问题,需要兼顾数据结构操作与数学逻辑的结合。二...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。