【题解】LeetCode-两数相加(add-two-numbers)
2.两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路一
看到这题,一般来说有过dfs经验的基本上应该可以反应为:先递归转成数字,再运算出结果,然后把结果转成链表。本着探(wu)索(liao)的精神,我尝试了这种方法,遗憾的是虽然没有超时,但int,long都会越界。这说明什么?说明人家数据还可以嘛~
解法一
比较暴力,没什么好说的。但是用BigInteger才过的,不推荐。
import java.math.BigInteger;
/*** 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) {BigInteger ans = getVal(l1, BigInteger.ONE).add(getVal(l2, BigInteger.ONE));return buildList(ans);}// 表 -> 数字public BigInteger getVal(ListNode list, BigInteger loc) {if (null == list) {return BigInteger.ZERO;}return loc.multiply(BigInteger.valueOf(list.val)).add(getVal(list.next, loc.multiply(BigInteger.TEN)));}// 数字 -> 表public ListNode buildList(BigInteger n) {if (BigInteger.ZERO.equals(n)) {return new ListNode(0);}BigInteger MOD = BigInteger.TEN;ListNode header = new ListNode(n.mod(MOD).intValue());ListNode list = header;n = n.divide(MOD);while (!BigInteger.ZERO.equals(n)) {list.next = new ListNode((int) (n.mod(MOD).intValue()));list = list.next;n = n.divide(MOD);}return header;}
}
思路二
可能是太久没刷题了~
仔细一看这不是大一大数相加类型的入门题嘛
解法二
解决大数问题是把数字当字符串处理,加减乘都是按位运算的,而且这里人家还给你倒序了,岂不是美滋滋~ 这题其实和归并排序的合并思路是一样的,只是比较取值变成了加法运算;
遍历链表,对应位相加再保留进位标志。需要注意的是,如果最后进位标志不是为0的话,还需要添加一个节点以保留进位。
PS:LeetCode就是写桩有点麻烦,还好保留上面解法一的代码做桩~
/*** 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 (null == l1) {return l2;}if (null == l2) {return l1;}int inCome = 0, ans = 0;ListNode header = null, list = null;do{if (null == l1) {linkedNext(list, l2, inCome);return header;}if (null == l2) {linkedNext(list, l1, inCome);return header;}ans = inCome + l1.val + l2.val;inCome = ans / 10;if(null != list){list.next = new ListNode(ans % 10);list = list.next;}else{list = new ListNode(ans % 10);header = list;}l1 = l1.next;l2 = l2.next;}while(null != l1 || null != l2);if(0!=inCome){linkedNext(list, null, inCome);}return header;}private void linkedNext(ListNode list, ListNode next, int inCome) {if(null == next){if(0 != inCome) {list.next = new ListNode(inCome);}return;}ListNode temp = next;int ans;while (true) {ans = temp.val + inCome;temp.val = ans % 10;inCome = ans / 10;if(inCome == 0){// 不需要进位了break;}if(null == temp.next){// 需要加结点才能补足进位break;}temp = temp.next;}// 加结点补足进位if(inCome != 0){temp.next = new ListNode(inCome);}list.next = next;}
}
最后,
上面两个解法都过了,猜一猜谁更优?【!!!不要用看煞笔的眼神看笔者!!!】
重申一下,笔者并不是ACM选手,之所以写题解是为了缓解一下被业务轰炸了的大脑,如果你要找最优解,一般不要往这个博客跑,哈哈哈~~
【题解】LeetCode-两数相加(add-two-numbers)相关推荐
- leetcode算法—两数相加 Add Two Numbers
关注微信公众号:CodingTechWork,一起学习进步. 题目 Add Two Numbers: You are given two non-empty linked lists represen ...
- LeetCode第二题:两数相加(Add Two Numbers)
LeetCode第二题:两数相加(python,java) You are given two non-empty linked lists representing two non-negative ...
- [Swift]LeetCode2. 两数相加 | Add Two Numbers
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- LeetCode两数相加
一.两数相加 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设 ...
- leetcode 两数相加
给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...
- leetcode 两数相加c++_167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1和 index2,其中 index1必须小 ...
- 算法练习之leetcode两数相加(1)
题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...
- leetcode 两数相加,在ubuntu上编译通过,显示结果了,在leetcode上报错了,找错在哪?
给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...
- leetcode第一题两数相加
leetcode两数相加: 提示: 问题描述: int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int ...
- LeetCode题库整理【Java】—— 2 两数相加
LeetCode题库整理[Java] 2.两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果, ...
最新文章
- 浅谈ASP.net中的DataSet对象
- 解题代码 用jquery控制一个按钮当一次点击完之后5 秒后才能继续点击 验证码的制作...
- LeetCode Algorithm 204. 计数质数
- 大数据WEB阶段(十六)JavaEE三大 核心技术之监听器Listener
- Lucene5.5.4入门以及基于Lucene实现博客搜索功能
- SpringMVC请求参数乱码问题
- 【原】unity3D ios 退出保存数据(2)
- 疯狂软件mysql视频_疯狂软件MySql视频
- c语言学习-自定义并调用两个函数,分别求两个整数的最大公约数和最小公倍数
- c语言串的存储操作完整,c语言中关于串的相关知识以及操作
- 数据库学生管理系统课程设计
- 特洛伊木马程序_历史著名的特洛伊木马计,希腊的人造礼物
- ASP.NET在Web窗体上输出九九乘法表
- CPU的工作原理和内部架构
- android nmea 工具,android – 如何从nmea句子信息计算以米为单位的gps准确度
- 华为网络设备查询系统时间及修改系统时间命令
- 【云图说合集】阅识风云之云图说系列,是您了解华为云的必备利器
- Numpy基础+进阶+高级
- 网易免费企业(域名)邮箱注册及验证
- (3) Top 6 移动广告Mediation平台Admob Mopub Appodeal