在这篇文章中,我们将探讨一个有趣的算法问题:给定两个非空的链表,它们表示两个非负整数。我们的目标是将这两个数相加,并返回一个新的链表,以表示它们的和。
问题背景
给定两个非空链表 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; // 返回结果链表的头部
}
}
总结
这个例子展示了如何通过链表表示逆序整数,并模拟数字相加的过程,最终得到新的链表表示结果。这个问题有助于加深对链表操作和数学运算的理解。希望这次讨论能为你提供新的见解!