LeetCode 2.两数相加

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
	 }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值