1.题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2.我的解答
整体思路:先将两个链表转化为数字之后相加,再将结果转换为链表
/**
* 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) {
int num1=convert(l1);
int num2=convert(l2);
int num=num1+num2;
ListNode result=convertList(num);
return result;
}
public int convert(ListNode list){
String result="";
ListNode temp=list;
while(temp!=null){
result=temp.val+result;
temp=temp.next;
}
int num=Integer.parseInt(result);
return num;
}
public ListNode convertList(int num){
ListNode root=new ListNode(num%10);
num=num/10;
ListNode temp=root;
while(num!=0){
ListNode node=new ListNode(num%10);
temp.next=node;
temp=temp.next;
num=num/10;
}
return root;
}
}
测试已经过了,但是运行的时候报错
执行出错信息:
Line 26: java.lang.NumberFormatException: For input string: "9999999991"
最后执行的输入:
[9] [1,9,9,9,9,9,9,9,9,9]
由于**Integer.MAX_VALUE的限制,导致报错**
3.利用链表
/**
* 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) {
//一个为0的时候返回另一个
if(l1==null)return l2;
if(l2==null)return l1;
ListNode head=new ListNode();
//指向前一个的指针
ListNode pre=head;
//余数 相当于进位的数字
int lastvalue=0;
while(l1!=null&&l2!=null)
{
int value=l1.val+l2.val+lastvalue;
lastvalue=value/10;//更新
//生成新节点
ListNode newnode=new ListNode(value%10);
pre.next=newnode;
pre=pre.next;
l1=l1.next;
l2=l2.next;
}
//肯定有一条路跑完
if(l1==null) // l2可能跑完 可能没跑完
{
if(lastvalue==0) //没有进位 直接把两个链表连接
{
pre.next=l2;
}
else
{
pre.next = l2;
while(l2!=null) //存在进位 可以代码合并 但合并可能做多余加0操作
{
pre=pre.next; //总得有个东西指向前一个节点 不然连接不了
int value=l2.val+lastvalue;
lastvalue=value/10;
l2.val=value%10;
l2=l2.next;
}
}
}
if(l2==null)// l1可能跑完 可能没跑完
{
if(lastvalue==0)
{
pre.next=l1; //跟以上同理
}
else
{
pre.next = l1;
while(l1!=null) //存在进位 可以代码合并 但合并可能做多余加0操作
{
pre=pre.next; //总得有个东西指向前一个节点 不然连接不了
int value=l1.val+lastvalue;
lastvalue=value/10;
l1.val=value%10;
l1=l1.next;
}
}
}
//好了两个链表全部遍历 这时候要思考还有没有进位
if(lastvalue!=0)
{
pre.next=new ListNode(lastvalue);
}
return head.next;
}
}