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 实现的解决方案:

2,两数相加 - 链表表示法_第1张图片

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; // 返回结果链表的头部
    }
}

总结

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

你可能感兴趣的:(力扣,java,链表,数据结构,java,算法)