题目(英文原版)
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2−>4−>3)+(5−>6−>4)
Output: 7−>0−>8
题目(中文翻译版)
你得到两个链表表示两个非负整数。这个数字的存储是以逆序进行存储的,列表的每一个节点都存储了一个数字。将这两个数字相加并作为一个列表来返回。
输入: (2→4→3)+(5→6→4)
输出: 7→0→8
解析
题目的意思很简单,假设有两个数字,分别是342和465。这两个数字加起来是807.然而存储的时候是以逆序存储的。比如342以链表存储为 2→4→3 ,465以链表存储为 5→6→4 。
如何将这个链表转换成数字相加则成为主要的困难。
而要值得注意的是,由于列表是可以很长,所以用普通的int型数字,必然会导致超出,所以用Java的BigInteger来实现较为简单。然而BigInteger需要的是用String类型的参数来进行初始化构造,所以就变成了如何让链表数字变成字符串类型,而且还是将倒序的数字变成正序数字的形式。
然而这很简单,比如对于列表342,我们可以将数字一个个提出来,比如对于字符串n1来说,我们先让n1为空字符串,然后342提出3,然后”3”+n1赋值给n1,这时候n1就是“3”。
然后再提出数字4,这时候,4应该在3之前,那么连接的时候,应该让4在3之前。所以就有了n1=”4”+n1,这样就能让n1=”43”。
同理就可以把一个倒序的数字链表变成了所需要数字的正序形式的字符串类型,然后用BigInteger进行大整数型加减得到n3。
得出来的结果n3只是BigInteger类型,然后转换成字符串,比如“90005”。那么我们需要的是把这个数字的字符串倒序存入链表中。
那么应该怎么做呢。字符串遍历可以通过charAt获得下标元素,然后我们可以从字符串的最大的下标倒序进行遍历,就能得到了倒序的数字,然后我们得考虑如何进行存储。
要知道,我们学过链表,对于链表的插入应该不陌生吧。如果不了解链表的插入,请查看这篇文章
我们用一个l3_return引用不变,一直指向链表的第一个元素。用l3来进行指向链表的最后一个元素,用以插入。
最先开始的时候,是先用temp生成一个节点,存储应该插入的值,然后用l3指向这个节点,再更新l3。
最后的结果是把l3_return返回即可。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
import java.math.BigInteger;
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null)return l2;
if(l2 == null)return l1;
//l1和l2均不为null
String n1_string="",n2_string="";
while(l1 != null){//将l1变成数字的字符串形式
n1_string = l1.val+n1_string;
l1=l1.next;
}
while(l2 != null){//将l2变成数字的字符串形式
n2_string = l2.val+n2_string;
l2 = l2.next;
}
BigInteger n1,n2,n3;
n1 = new BigInteger(n1_string);//将l1变成大整数
n2 = new BigInteger(n2_string);//将l2变成大整数
n3 = n1.add(n2);//将l1和l2相加
String nString = n3.toString();//将所得结果变成字符串
ListNode l3=new ListNode(Integer.parseInt(nString.charAt(nString.length()-1)+""));
ListNode l3_return = l3;//初始化链表的第一个元素
//l3_return 是指向第一个元素的头结点
//l3指向链表的最后一个元素,便于插入
for(int j=nString.length()-2;j>=0;j--)//从倒数第二个数字起倒序插入
{
ListNode temp = new ListNode(Integer.parseInt(nString.charAt(j)+""));//待插入元素
l3.next = temp;
l3 = l3.next;//更新l3
}
return l3_return;
}
}
测试代码
package leetcode2;
import java.math.BigInteger;
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null)return l2;
if(l2 == null)return l1;
//l1和l2均不为null
String n1_string="",n2_string="";
while(l1 != null){
n1_string = l1.val+n1_string;
l1=l1.next;
}
while(l2 != null){
n2_string = l2.val+n2_string;
l2 = l2.next;
}
BigInteger n1,n2,n3;
n1 = new BigInteger(n1_string);
n2 = new BigInteger(n2_string);
n3 = n1.add(n2);
String nString = n3.toString();
ListNode l3=new ListNode(Integer.parseInt(nString.charAt(nString.length()-1)+""));
ListNode l3_return = l3;
for(int j=nString.length()-2;j>=0;j--)
{
ListNode temp = new ListNode(Integer.parseInt(nString.charAt(j)+""));
l3.next = temp;
l3 = l3.next;
}
return l3_return;
}
public static void main(String[] args) {
ListNode l1,l2,l3;
l1 = new ListNode(9);
l2 = new ListNode(1);
l2.next = new ListNode(9);
l2.next.next = new ListNode(9);
l2.next.next.next = new ListNode(9);
l2.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next.next.next.next.next = new ListNode(9);
l2.next.next.next.next.next.next.next.next.next.next = new ListNode(9);
Solution s = new Solution();
l3 = s.addTwoNumbers(l1, l2);
while(l3 != null){
System.out.print(l3.val);
l3 = l3.next;
}
}
}