两个链表相加的 Java 实现

在计算机科学中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本文将探讨如何将两个链表表示的非负整数相加,并给出相应的 Java 实现。

问题描述

给定两个链表,链表的每个节点代表一个数字,链表的头节点代表数字的最低位。我们的目标是将两个链表表示的数字相加,并返回一个新的链表,表示结果。

举个例子:

  • 链表 l1 代表的数字是 342(即 2 -> 4 -> 3)。
  • 链表 l2 代表的数字是 465(即 5 -> 6 -> 4)。

这两个数字相加后得到 807(即结果链表表示为 7 -> 0 -> 8)。

算法思路

我们可以使用一个遍历的方式来逐位相加两个链表。需要注意的是,要处理不同位数造成的进位。具体步骤如下:

  1. 初始化一个新的链表用于保存结果以及一个进位值。
  2. 同时遍历两个链表,逐位相加。
  3. 如果某个链表已经遍历完了,直接将另一个链表的值继续加入结果。
  4. 最后处理进位。

Java 实现

下面是实现该算法的 Java 代码示例:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, current = 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;
            current.next = new ListNode(sum % 10);
            current = current.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }
        
        if (carry > 0) {
            current.next = new ListNode(carry);
        }
        
        return dummyHead.next;
    }
}

状态图

在上述实现中,程序的流程可以用状态图来表示,状态图展示了在不同阶段的变量状态,如下所示:

stateDiagram
    [*] --> Init
    Init --> Traverse
    Traverse --> CheckList1
    Traverse --> CheckList2
    CheckList1 --> AddCurrent
    CheckList2 --> AddCurrent
    AddCurrent --> ComputeSum
    ComputeSum --> CheckCarry
    CheckCarry --> Done
    Done --> [*]

结尾

通过上述介绍,我们成功地实现了两个链表相加的功能,使用 Java 编写了相应的代码。链表的操作与常规数组操作有所不同,但它给我们的数据结构增添了灵活性和高效性。对于链表的进一步学习,可以帮助我们更好地理解数据结构与算法的基础,这在编程和计算机科学中是至关重要的。希望这篇文章能对你理解链表相加有所帮助!