[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、取出和中的每个数字倒序存入链表
但提交之后出现了Wrong Answer
原因是链表转化的数字为9999999991,超出了Java中int的范围。
既然范围不够大,就把int全改成long就好了
提交后,
对于超长的数字,仍然无法完成计算,程序依旧不够鲁棒。
将int改成long这种扩大范围的思想,只是一种治标不治本的方法。
到这里,我们只能放弃之前写的代码,重新想一种更强大更鲁棒的算法了。
下面是http://blog.csdn.net/crazy1235/article/details/52914703 这篇博文提供的解法
思路:遍历两个链表,以此相加,把进位的数字计入下一组相加的数字中
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; } }
相关文章推荐
- leetcode 2. Add Two Numbers python实现的理解,结点,单链表的应用,大数,进位的问题
- [c++] LeetCode Add Two Numbers问题
- LeetCode 2. Add Two Numbers 链表加和问题
- 【Leetcode】之Add Two Numbers问题
- Leetcode问题-2(Add Two Numbers)
- LeetCode-Add Two Numbers-链表数字相加-链表操作+加法进位
- [LeetCode] Add Two Numbers 两个数字相加
- LeetCode2——Add Two Numbers(两个链表中的数字相加,形成新链表)
- LeetCode-2. Add Two Numbers(链表实现数字相加)
- [LeetCode] 2. Add Two Numbers 两个数字相加
- 【Leetcode问题搬运翻译】Add two numbers
- 【LeetCode解答二】Add Two Numbers问题Java解答
- Leetcode练习-两个数字相加(Add two numbers)
- LeetCode题解 || Add Two Numbers 问题
- [Leetcode]Add Two Numbers 链表实现大数字相加
- 数字加和问题: plus one , Add Binary, Add Two Numbers
- [LeetCode] Add Two Numbers II 两个数字相加之二
- leetcode 002 —— add two numbers
- 【LeetCode】2_Add Two Numbers
- Leetcode NO.2 Add Two Numbers