给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
这道题的解题思路是模拟手工进行两位数相加的过程。我们首先创建一个虚拟头节点,方便构建结果链表。然后,使用两个指针分别遍历两个输入链表,同时维护一个进位数变量。在每一步中,我们计算当前位的和(包括进位数),更新进位数,并创建新节点存储当前位的值。当遍历完所有节点后,如果还有进位数,我们再创建一个新节点存储进位数。最终返回虚拟头节点的下一个节点,即为结果链表的头节点。这种思路能够处理链表长度不等和进位的情况,保证正确地计算两个数之和
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//创建一个虚拟头节点,方便后续操作
ListNode pre = new ListNode(0);
//当前节点,指向虚拟头节点,用于构建结果链表
ListNode cur = pre;
//进位数,初始化为0
int carry = 0;
//当l1或l2不为空时继续循环
while(l1 !=null || l2 != null){
//获取l1当前节点的值,如果l1为空则取0
int x = l1 == null ? 0:l1.val;
//获取l2当前节点的值,如果l2为空则取0
int y = l2 == null ? 0:l2.val;
//计算当前位的和,包括进位数
int sum = x+y+carry;
//更新进位数,sum除以10的商即为进位数
carry = sum /10;
//sum取余即为当前位的值
sum = sum % 10;
//创建新节点,存储当前位的值,并将其添加到结果链表中
cur.next = new ListNode(sum);
//移动当前节点指针
cur = cur.next;
//如果l1不为空,移动l1指针到下一个节点
if(l1 != null)
l1 = l1.next;
//如果l2不为空,移动l2指针到下一个节点
if(l2 != null)
l2 = l2.next;
}
//如果循环结束后还有进位数,创建新节点存储进位数
if(carry>0){
cur.next = new ListNode(carry);
}
//返回虚拟头节点的下一个节点,即结果链表的头节点
return pre.next;
}
}