LeetCode-Add Two Numbers
发布日期:2025-04-05 02:59:17 浏览次数:13 分类:精选文章

本文共 1375 字,大约阅读时间需要 4 分钟。

链表相加问题:逐位处理,避免进位溢出

问题描述

我们需要将两个非空链表表示的非负整数相加。这些数字的数字按逆序存储,每个节点只包含一个数字。由于链表的长度可能不一致,我们需要逐位处理,确保不会有进位溢出。

输入说明

  • 两个链表分别表示两个非负整数,数字按逆序存储。
  • 链表的节点值不会有前导零,除非数字本身为零。
  • 两个链表的长度可能不同。

方法思路

为了实现逐位相加,我们可以从链表的最后一个节点开始,逐步向前处理。具体步骤如下:

  • 初始化一个哑节点,用于构建结果链表。
  • 初始化当前节点指针,指向哑节点。
  • 初始化进位变量为零。
  • 在两个链表都存在节点的情况下,或者有一个链表还有节点的情况下,继续处理:
    • 取出当前节点的值(如果链表为空,则取零)。
    • 计算当前位的和,包括进位。
    • 更新进位和当前位的值。
    • 将计算结果插入当前节点后。
    • 移动到下一个节点。
  • 处理完所有节点后,检查是否存在剩余进位,如果存在,则插入到结果链表末尾。
  • 这种方法确保我们能够正确处理不同长度的链表,并且逐位相加,避免整体转换为数字导致的溢出问题。

    代码实现

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {    ListNode dummyHead = new ListNode(0);    ListNode p = l1, q = l2;    ListNode curr = dummyHead;    int carry = 0;        while (p != null || q != null) {        int x = (p != null) ? p.val : 0;        int y = (q != null) ? q.val : 0;                int sum = carry + x + y;        carry = sum / 10;        curr.next = new ListNode(sum % 10);        curr = curr.next;                if (p != null) p = p.next;        if (q != null) q = q.next;    }        if (carry > 0) {        curr.next = new ListNode(carry);    }        return dummyHead.next;}

    代码解释

  • 哑节点初始化:创建一个哑节点作为结果链表的起始点,避免了直接处理链表头部的复杂性。
  • 指针设置:初始化两个指针分别指向两个链表的头节点,使用哑节点作为结果链表的当前节点。
  • 进位变量:用于处理相加时的进位。
  • 循环处理:只要有节点存在,继续处理当前位。
    • 取值处理:获取当前节点的值,如果链表为空则取零。
    • 计算和:包括当前位的数字和进位。
    • 处理进位:更新进位。
    • 插入节点:将计算结果插入当前节点后。
    • 移动指针:处理下一个节点。
  • 处理剩余进位:如果在处理完所有节点后还有进位,插入到结果链表末尾。
  • 这种方法确保了我们能够正确地处理不同长度的链表,并且逐位相加,避免了整体转换为数字可能带来的溢出问题。

    上一篇:LeetCode-Binary Tree Maximum Path Sum
    下一篇:Leetcode-991 Broken Calculator(坏了的计算器)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月25日 12时57分48秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章