您的位置:首页 > 其它

[LeetCode]2.Add Two Numbers 超出数字范围问题

2018-02-27 10:37 465 查看
原题:

You are given two non-empty linked lists representing two non-negative integers. 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.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

翻译:

给你两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点都包含一个数字。添加这两个数字并将其作为链接列表返回。

您可以假设这两个数字不包含任何前导零,除了数字0本身。

例子:

输入:(2→4→3)+(5→6→4)

输出: 7→0→8

说明: 342 + 465 = 807

看到题目,我直接写出了一种解法,大概是下面这样的,思路是:

1、先将链表1、2转换成整数

2、将上面的两个整数求和

3、取出和中的每个数字倒序存入链表

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//非空判断
if(l1 == null && l2 == null)
return null;
if(l1 == null)
return l2;
if(l2 == null)
return l1;

int num1 = 0, num2 = 0;
int sum1 = 0, sum2 = 0, sum = 0;
//将链表1转换成整数
while(l1 != null) {
sum1 = sum1 + l1.val * (int)Math.pow(10,num1);
l1 = l1.next;
num1++;
}
//将链表2转换成整数
while(l2 != null) {
sum2 = sum2 + l2.val * (int)Math.pow(10,num2);
l2 = l2.next;
num2++;
}
//求和
sum = sum1 + sum2;

ListNode pre = null, newHead = null;
if(sum == 0) {
ListNode node = new ListNode(0);
return node;
}
//将和的数字一个一个放进新链表里
while(sum != 0) {
int i = (int) (sum % 10);
ListNode node = new ListNode(i);
if(pre != null)
pre.next = node;
else
newHead = node;
pre = node;
sum = sum/10;
}
return newHead;
}
}


但提交之后出现了Wrong Answer



原因是链表转化的数字为9999999991,超出了Java中int的范围

既然范围不够大,就把int全改成long就好了

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null && l2 == null)
return null;
if(l1 == null)
return l2;
if(l2 == null)
return l1;

long num1 = 0, num2 = 0;
long sum1 = 0, sum2 = 0, sum = 0;

while(l1 != null) {
sum1 = sum1 + l1.val * (long)Math.pow(10,num1);
l1 = l1.next;
num1++;
}
while(l2 != null) {
sum2 = sum2 + l2.val * (long)Math.pow(10,num2);
l2 = l2.next;
num2++;
}

sum = sum1 + sum2;

ListNode pre = null, newHead = null;
if(sum == 0) {
ListNode node = new ListNode(0);
return node;
}
while(sum != 0) {
int i = (int) (sum % 10);
ListNode node = new ListNode(i);
if(pre != null)
pre.next = node;
else
newHead = node;
pre = node;
sum = sum/10;
}
return newHead;
}
}


提交后,



对于超长的数字,仍然无法完成计算,程序依旧不够鲁棒。

将int改成long这种扩大范围的思想,只是一种治标不治本的方法。

到这里,我们只能放弃之前写的代码,重新想一种更强大更鲁棒的算法了。

下面是http://blog.csdn.net/crazy1235/article/details/52914703 这篇博文提供的解法

思路:遍历两个链表,以此相加,把进位的数字计入下一组相加的数字中

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1 == null || l2 == null) {
return null;
}
ListNode temp = new ListNode(0);
ListNode result = temp;

int value1 = 0;
int value2 = 0;
while (l1 != null && l2 != null) {
//(l1的值 + l2的值 + 上一次计算的进位)再取个位
value2 = (l1.val + l2.val + value1) % 10;
//(l1的值 + l2的值 + 上一次计算的进位)再取十位
value1 = (l1.val + l2.val + value1) / 10;

temp.next = new ListNode(value2);
l1 = l1.next;
l2 = l2.next;
temp = temp.next;
if (l1 == null && l2 == null) {
break;
}
if (l1 == null) {
l1 = new ListNode(0);
}
if (l2 == null) {
l2 = new ListNode(0);
}
}
if (value1 != 0) {
temp.next = new ListNode(value1);
}
return result.next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: