给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2){
ListNode head = null;
ListNode index = null;
int carry = 0;
while (l1!=null||l2!=null){
int n1=0;
int n2=0;
if(l1!=null){
n1 = l1.val;
}
if(l2!=null){
n2=l2.val;
}
int sum = n1+n2+carry;
carry = sum/10;
if(head==null){
head =index = new ListNode(sum%10);
}else {
index.next =new ListNode(sum%10);
index = index.next;
}
if(l1!=null){
l1 = l1.next;
}
if(l2!=null){
l2 = l2.next;
}
}
if(carry>0){
index.next = new ListNode(carry);
}
return head;
}
}
执行过程
-
初始化:
head
和index
初始化为null
,因为结果链表开始为空。carry
初始化为 0,用于处理进位情况。
-
循环过程:
- 在
while
循环中,通过遍历两个输入链表l1
和l2
,同时处理可能的进位。 - 如果链表节点非空,则取出节点的值
n1
和n2
,否则置为 0。 - 将
n1
、n2
和carry
相加,得到sum
,更新carry
。 - 根据
sum % 10
创建新节点,并更新结果链表的head
和index
。 - 将输入链表
l1
和l2
向前移动一步。
- 在
-
循环结束:
- 当
while
循环结束后,检查最后的进位carry
是否大于 0,若是则在结果链表末尾添加一个新节点。
- 当
-
返回值:
- 返回
head
,即为两个输入链表相加后的结果链表的头节点。
- 返回