2,两数相加 - 链表表示法

在这篇文章中,我们将探讨一个有趣的算法问题:给定两个非空的链表,它们表示两个非负整数。我们的目标是将这两个数相加,并返回一个新的链表,以表示它们的和。

问题背景

给定两个非空链表 l1 和 l2,它们分别代表两个非负整数。链表中的每个节点存储一个数字,并按逆序方式组织,即链表的头部表示数字的个位。

我们的任务是将这两个数字相加,并返回一个新的链表,其中每个节点包含新数字的一个数字位。

示例

  • 示例 1:l1 = [2,4,3], l2 = [5,6,4],输出 [7,0,8],表示 342 + 465 = 807。
  • 示例 2:l1 = [0], l2 = [0],输出 [0],表示 0 + 0 = 0。
  • 示例 3:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9],输出 [8,9,9,9,0,0,0,1],表示 9999999 + 9999 = 10009998。

解题思路

我们可以通过遍历两个链表来模拟加法运算。初始化一个新链表来存储结果,使用一个指针从链表头部开始逐位相加,并考虑进位的情况。

代码实现

下面是使用 Java 实现的解决方案:

class ListNode {
    int val;
    ListNode next;
    
    ListNode(int val) {
        this.val = val;
    }
}

public class AddTwoNumbers {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 创建一个虚拟节点,简化链表操作
        ListNode dummy = new ListNode(0);
        ListNode current = dummy; // 指针用于遍历新链表
        int carry = 0; // 进位标志

        while (l1 != null || l2 != null) {
            // 获取当前节点的值(若为空则取0)
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;

            // 计算当前位数字的和(包括进位)
            int sum = x + y + carry;
            carry = sum / 10; // 更新进位
            current.next = new ListNode(sum % 10); // 创建新节点,存储结果
            current = current.next; // 指针后移

            // 遍历链表
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }

        // 检查是否有额外的进位,若有则创建新节点
        if (carry > 0) {
            current.next = new ListNode(carry);
        }

        return dummy.next; // 返回结果链表的头部
    }
}

总结

这个例子展示了如何通过链表表示逆序整数,并模拟数字相加的过程,最终得到新的链表表示结果。这个问题有助于加深对链表操作和数学运算的理解。希望这次讨论能为你提供新的见解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值