2. 两数相加
程序员文章站
2022-03-27 09:23:39
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807来源:力扣(LeetCode)链接:https://leetcode...
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
这道题精度是大坑。我想的是先把链表变数字,直接数字计算完再转回链表,然后就掉进了精度的大坑,一开始用int封装,不够用,改为long,还是不够用。最后用了BigInteger才实现,没啥算法,链表类都给了,封装2个方法,一个链表转数字,一个数字转链表即可实现。第2题就E了5次,劝退大闸。。。。
代码如下
package com.test;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class MyTest {
public static void main(String[] args) {
ListNode l1 = getListNode(new BigInteger("1000000000000000000000000000001"));
ListNode l2 = getListNode(new BigInteger("465"));
System.out.println(getInt(getNum(l1,l2)));
}
public static ListNode getNum(ListNode l1, ListNode l2){
BigInteger i1 = getInt(l1);
BigInteger i2 = getInt(l2);
BigInteger num = i1.add(i2);
return getListNode(num);
}
/**
* 链表转数字
* @param l
* @return
*/
public static BigInteger getInt(ListNode l) {
BigInteger result = new BigInteger("0");
int squ = 0;
ListNode listNode = l;
do {
BigInteger m = new BigInteger("10") ;
BigInteger n = m.pow(squ).multiply(new BigInteger(String.valueOf(listNode.val))) ;
result = result.add(n);
listNode = listNode.next;
squ++;
} while (listNode != null);
return result;
}
/**
* 数字转链表
* @param num
* @return
*/
public static ListNode getListNode(BigInteger num){
List<BigInteger> list = new ArrayList<>();
List<ListNode> listNodeList = new ArrayList<>();
BigInteger a ;
if(num.compareTo(new BigInteger("0")) == 0){
return new ListNode(0);
}
while(num.compareTo(new BigInteger("0")) != 0){
//a=num%10;
a = num.divideAndRemainder(new BigInteger("10"))[1];
//num=num/10;
num = num.divideAndRemainder(new BigInteger("10"))[0];
list.add(a);
int x = a.intValue();
listNodeList.add(new ListNode(x));
}
for(int i = 0;i<listNodeList.size()-1;i++){
listNodeList.get(i).next = listNodeList.get(i+1);
}
return listNodeList.get(0);
}
}
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
本文地址:https://blog.csdn.net/ileeshore/article/details/112004599
下一篇: python 正则表达式学习小结