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

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

5个月前 (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;                  // 返回哑节点的下一个节点(即实际结果)  
    }  
};


原创内容 转载请注明出处

分享给朋友:

相关文章

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

题目解读‌斐波那契数列是一个经典的数学问题,在计算机科学中常被用作算法教学的入门案例。这个神奇的数列从0和1开始,后续每个数字都是前两个数字之和。题目要求我们计算第n个斐波那契数,看似简单的问题背后却...

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

力扣1472题解:浏览器历史记录模拟(C++代码实现与详细解析)

一、题目解读力扣1472题要求设计一个“浏览器历史记录”类,支持以下功能:    1. 初始化浏览器,指定首页URL;   &nb...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

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

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

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

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

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

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

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

LeetCode 2074题解:反转链表中的节点间隔(虚拟节点+分组反转)

一、题目解读LeetCode 2074题要求对链表进行分组反转:将链表按节点数分组,若当前组长度为偶数则反转该组节点,奇数长度则保持不变。例如,输入链表 [1,2,3,4,5,6],分组后 [1,2,...

发表评论

访客

看不清,换一张

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