当前位置:首页 > 力扣 > 力扣第2题:三步掌握递归解法与进位传递技巧

力扣第2题:三步掌握递归解法与进位传递技巧

4个月前 (05-10)

给定两个非空链表,每个链表代表一个非负整数。数字按照逆序存储(如整数 342 存储为 2→4→3),要求将这两个数相加并以相同形式的链表返回结果。例如输入 2→4→3 和 5→6→4,它们的和是 807,输出应为 7→0→8。问题本质是实现按位相加,并处理进位和链表长度不一致的情况。


递归解法思路与过程‌:

1‌.递归终止条件‌:当两个链表均为空且无进位时结束递归。

‌2.补齐短链表‌:若其中一个链表已走到末尾,则创建一个值为 0 的节点,保证后续递归中位数对齐。

‌3.计算当前值和进位‌:将当前位的值相加并加上进位,取模得到当前节点值,整除得到新的进位。

4‌.递归连接节点‌:新建节点保存当前位的值,并将其作为当前节点的后继,继续递归处理下一位。


力扣第2题:三步掌握递归解法与进位传递技巧 力扣 递归 链表 单链表 第1张


代码:

class Solution {
public:
    void add(ListNode* l1, ListNode* l2, int a, ListNode* head) {
        // 终止条件:两链表为空且进位为0
        if (l1 || l2 || a != 0) {
            // 若当前链表指针为空,创建值为0的节点补齐
            if (!l1) {
                ListNode* tmp = new ListNode(0);
                l1 = tmp;
            }
            if (!l2) {
                ListNode* tmp = new ListNode(0);
                l2 = tmp;
            }
            // 新建节点存储当前位的计算结果
            ListNode* tmp = new ListNode;
            int b = l1->val + l2->val + a;  // 当前位的和(包括进位)
            tmp->val = b % 10;               // 当前位的值
            a = b / 10;                      // 新的进位
            head->next = tmp;                // 将当前节点连接到结果链表
            // 递归处理下一位,传入下一节点和进位
            add(l1->next, l2->next, a, tmp);
        }
    }

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head = new ListNode;      // 创建哑节点作为结果链表的头部
        add(l1, l2, 0, head);               // 从初始进位0开始递归
        return head->next;                  // 返回哑节点的后继,即真正的结果链表
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣70题:告别暴力递归!从零实现记忆化搜索解法

力扣70题:告别暴力递归!从零实现记忆化搜索解法

题意解析:想象你站在楼梯底部,面前有n级台阶。每次你可以选择跨1级或2级台阶,最终到达顶端的路径有多少种不同的走法?这个问题本质上是在探索分叉决策的叠加效果——当我们把每个台阶处的选择看作二叉树的分支...

力扣面试题 16.01 :用异或操作玩转两数交换

力扣面试题 16.01 :用异或操作玩转两数交换

给定一个长度为 2 的整数数组 numbers,要求在不使用额外内存空间(即不使用临时变量)的情况下,交换数组中的两个元素并返回。题目考验对位运算的理解与应用,需通过巧妙的异或操作实现两数值...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

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

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

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

【牛客157题】:反转链表指定区间(虚拟头节点解法)

【牛客157题】:反转链表指定区间(虚拟头节点解法)

一、题目解读牛客第157题要求反转链表中第m到n个节点(包含m和n)的区间,并保持其他节点顺序不变。例如,给定链表1→2→3→4→5,m=2,n=4,应返回1→4→3→2→5。题目重点在于处理边界条件...

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

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

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

发表评论

访客

看不清,换一张

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