2,两数相加 - 链表表示法
2023-12-15 15:11:18
在这篇文章中,我们将探讨一个有趣的算法问题:给定两个非空的链表,它们表示两个非负整数。我们的目标是将这两个数相加,并返回一个新的链表,以表示它们的和。
问题背景
给定两个非空链表?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; // 返回结果链表的头部
}
}
总结
这个例子展示了如何通过链表表示逆序整数,并模拟数字相加的过程,最终得到新的链表表示结果。这个问题有助于加深对链表操作和数学运算的理解。希望这次讨论能为你提供新的见解!
文章来源:https://blog.csdn.net/qq_45476500/article/details/135014990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!