两个链表相加的 Java 实现
在计算机科学中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本文将探讨如何将两个链表表示的非负整数相加,并给出相应的 Java 实现。
问题描述
给定两个链表,链表的每个节点代表一个数字,链表的头节点代表数字的最低位。我们的目标是将两个链表表示的数字相加,并返回一个新的链表,表示结果。
举个例子:
- 链表
l1代表的数字是 342(即 2 -> 4 -> 3)。 - 链表
l2代表的数字是 465(即 5 -> 6 -> 4)。
这两个数字相加后得到 807(即结果链表表示为 7 -> 0 -> 8)。
算法思路
我们可以使用一个遍历的方式来逐位相加两个链表。需要注意的是,要处理不同位数造成的进位。具体步骤如下:
- 初始化一个新的链表用于保存结果以及一个进位值。
- 同时遍历两个链表,逐位相加。
- 如果某个链表已经遍历完了,直接将另一个链表的值继续加入结果。
- 最后处理进位。
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 编写了相应的代码。链表的操作与常规数组操作有所不同,但它给我们的数据结构增添了灵活性和高效性。对于链表的进一步学习,可以帮助我们更好地理解数据结构与算法的基础,这在编程和计算机科学中是至关重要的。希望这篇文章能对你理解链表相加有所帮助!
















