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

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

3周前 (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;                  // 返回哑节点的后继,即真正的结果链表
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

力扣1221:一次扫描解决分割平衡字符串 时间O(n)空间O(1)

题目重解给定一个仅包含'L'和'R'的字符串,要求将其分割成尽可能多的子串,且每个子串中'L'和'R'的数量相等。例如输入"R...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

发表评论

访客

看不清,换一张

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