给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/add-two-numbers/
分析:
1. 题目给出了两个非空链表,并且每个链表里面都逆序存放着一个数字,我们的任务是把这两个数字从链表里面取出来,把这两个数字相加,得到结果,再逆序存放到一个新的链表中去,最后在函数中返回这个新的链表。
2. 由于Java对字符串的操作十分灵活(如果字符串为数字序列的话,可以实现字符串的相加,前提是需要将字符串转换成BigInteger类,相加之后再转换成字符串类型就可以了),所以我们可以把链表当中存放的数字看成是字符串。
3. 具体代码如下:
/**
* Definition for singly-linked list.
* //这里指明了ListNode这个类当中具体的元素以及构造函数
* public class ListNode
* {
* int val;
* //存放的整型的数字
*
* ListNode next;
* //类型为ListNode,指向的下一个节点
*
* //该类的构造函数
* ListNode(int x)
* {
* val = x;
* }
*
* }
*/
import java.math.*;
//这里需要提前声明引入的包,由于使用到了BigInteger类,
//BigInteger类在java.math包当中
class Solution
{
public ListNode addTwoNumbers(ListNode l1, ListNode l2)
{
//a1、b1存放由l1、l2取出来的数(此时取出来是逆序的)
//a2、b2存放正序的数
String a1,a2,b1,b2;
//先将四个字符串类型的变量初始化
a1=a2=b1=b2="";
//unit存放的是数字序列中的每一位,
//作用:将每次记录的每一位放到新链表当中的每一节中
String unit="";
//p为ListNode类型的循环变量
ListNode p;
//c用来存放的两数相加的结果
String c="";
//用p依次取出l1中存放的数字,记录在a1中,此时是逆序的
for (p=l1;p!=null;p=p.next)
{
a1+=p.val;
}
//用a2记录下正序的数字序列
for (int i=a1.length()-1;i>=0;i--)
{
a2+=a1.charAt(i);
}
//以同样的方法计算l2中存放的数字
//用p依次取出l2中存放的数字,记录在b1中,此时是逆序的
for (p=l2;p!=null;p=p.next)
{
b1+=p.val;
}
//用b2记录下正序的数字序列
for (int i=b1.length()-1;i>=0;i--)
{
b2+=b1.charAt(i);
}
//由于要将a2、b2两个字符串相加,
//所以要将a2、b2先转换成BigInter类型,
//再用BigInter类里的add方法进行相加操作
//将a2转换成BigInter类型的a3
BigInteger a3=new BigInteger(a2);
//将b2转换成BigInter类型的b3
BigInteger b3=new BigInteger(b2);
//用c2记录下a3+b3的结果
BigInteger c2=a3.add(b3);
//将c2转换成字符串类型的c
c=c2.toString();
//声明l3,作为要放入结果的链表,初始化为null
ListNode l3=null;
//将字符串中的每一位逆序放入到链表l3中去
for (int i=c.length()-1;i>=0;i--)
{
//如果是第一次存放的话,就要为表头l3开辟空间
if (i==c.length()-1)
{
//取出第i个字符,并转化成字符串类型存放在unit中
unit=String.valueOf(c.charAt(i));
//为l3开辟空间,并将unit转换成整数类型存放到
//表头这一节中
l3=new ListNode(Integer.valueOf(unit));
//让p记下表头l3
p=l3;
}
//如果不是第一次存放的话,就要为p.next开辟空间
else
{
//取出第i个字符,并转化成字符串类型存放在unit中
unit=String.valueOf(c.charAt(i));
//如果不是表头的话,那么肯定要将数据放到p.next
//这一节当中去,所以要为p.next开辟空间
p.next=new ListNode(Integer.valueOf(unit));
//使p指向当前这一节
p=p.next;
}
}
//使链表表尾为空,作为结束的标志
p=null;
//返回表头l3
return l3;
}
}