题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
public static ListNode AddTwoNumbers(ListNode l1, ListNode l2){
ListNode head=null,tail=null;
int carry=0;
while(l1!=null || l2!=null){
int n1=l1!=null? l1.val: 0;
int n2=l2!=null? l2.val : 0;
int sum=n1+n2+carry;
if(head==null){
head=tail=new ListNode(sum%10);
}else {
tail.next=new ListNode(sum%10); //首先计算对应两个位置之和%10后,对应位置上的数字
tail=tail.next;
}
carry=sum/10;
if (l1!=null){
l1=l1.next;
}
if (l2!=null){ //分别将两个链表向后移动一位,如果某一个链表移动到头了,就从上面可知取值为0
l2=l2.next;
}
}
if (carry>0){
tail.next=new ListNode(carry); //最后一位进位值,赋值一个新的链表节点存取
}
return head;
}
时间复杂度:O(\max(m,n))O(max(m,n)),其中 mm 和 nn 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1)O(1) 的时间。
空间复杂度:O(1)O(1)。注意返回值不计入空间复杂度