力扣2 Add Two Number medium 题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的, 并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 情形1:
情形2:
情形3:
情形4:
public class AddTwoNumber {
public ListNode AddTwoNumber(ListNode l1,ListNode l2){
//1.边界
if (l1==null) return l2;
if (l2==null) return l1;
//进位标志
int carry=0;
//求和链表,dummy和prev初始化都指向第一个节点的上一个节点,dummy作为移动指针,prev作为标志指针
ListNode dummy=new ListNode(0);
ListNode prev=dummy;
//l1和l2相同长度的各节点求和
while (l1!=null&&l2!=null){
int total=l1.val+l2.val+carry; //对应位相加,并加上进位
int number=total%10; //取余,获取个位数
carry=total/10; //进位数
ListNode node=new ListNode(number);//新建求和节点
dummy.next=node; //连接求和链表
dummy=dummy.next;//移动指针
l1=l1.next;
l2=l2.next;
}
//l1比l2长的情况,求和链表要加上l1多出来的一段链表
while (l1!=null){
int total=l1.val+carry; //这个进位别漏掉
int number=total%10; //取余,获取个位数
carry=total/10; //进位数
ListNode node=new ListNode(number);//新建求和节点
dummy.next=node; //连接求和链表
dummy=dummy.next;//移动指针
l1=l1.next;
}
//l2比l1长的情况,求和链表要加上l2多出来的一段链表
while (l2!=null){
int total=l2.val+carry; //这个进位别漏掉
int number=total%10; //取余,获取个位数
carry=total/10; //进位数
ListNode node=new ListNode(number);//新建求和节点
dummy.next=node; //连接求和链表
dummy=dummy.next;//移动指针
l2=l2.next;
}
//l1和l2长度一致情况,最后节点求和后可能有进位,也要加上
if (carry!=0){
ListNode node=new ListNode(carry);
dummy.next=node;
}
return prev.next;
}
}