2.两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
方法一:暴力解法--链表长度过长时会发生溢出
- 将两个链表转为对应的数字
- 对这两个数相加 得到新的数字
- 将该书转化成链表并返回
public static ListNode addTwoNumbers(ListNode l1,ListNode l2){
long num1=getNumber(l1);
long num2=getNumber(l2);
long sum=num2+num1;
return convertToLinkedList(sum);
}
public static long getNumber(ListNode node){
long num=0;
long weight=1;//权重
while(node!=null){
num+=(long) node.val*weight;
node=node.next;
weight*=10;
}
return num;
}
public static ListNode convertToLinkedList(long num){
if(num==0)
return new ListNode(0);
ListNode dummy=new ListNode(0);//初始化一个哑巴节点
ListNode current=dummy;
while(num>0){
int digit=(int) num%10;
num/=10;
current.next=new ListNode(digit);
current=current.next;
}
return dummy.next;
}
方法二:逐位相加法
- 从两个链表的头节点开始,逐位相加
- 用一个变量 carry 来记录进位
- 将每一位的和加上进位%10,得到当前位的值
- 将每一位的和加上进位/10,得到进位的值
- 继续遍历链表,直到两个链表都遍历完且没有进位为止
public static ListNode addTwoNumbers(ListNode l1,ListNode l2){
ListNode dummy=new ListNode(0);
ListNode current=dummy;
int carry=0;
while (l1!=null||l2!=null||carry!=0){
int sum=carry;//总和初始化为进位值
if(l1!=null){
sum+= l1.val;
l1=l1.next;
}
if(l2!=null){
sum+= l2.val;
l2=l2.next;
}
carry=sum/10;//计算新进位
current.next=new ListNode(sum%10);//创建新节点 存储当前位的值
current=current.next;
}
return dummy.next;
}