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)相关推荐

  1. leetcode算法—两数相加 Add Two Numbers

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Add Two Numbers: You are given two non-empty linked lists represen ...

  2. LeetCode第二题:两数相加(Add Two Numbers)

    LeetCode第二题:两数相加(python,java) You are given two non-empty linked lists representing two non-negative ...

  3. [Swift]LeetCode2. 两数相加 | Add Two Numbers

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  4. LeetCode两数相加

    一.两数相加 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设 ...

  5. leetcode 两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  6. leetcode 两数相加c++_167. 两数之和 II - 输入有序数组

    167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1和 index2,其中 index1必须小 ...

  7. 算法练习之leetcode两数相加(1)

    题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...

  8. leetcode 两数相加,在ubuntu上编译通过,显示结果了,在leetcode上报错了,找错在哪?

    给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数字 0 ...

  9. leetcode第一题两数相加

    leetcode两数相加: 提示: 问题描述: int* twoSum(int* nums, int numsSize, int target, int* returnSize) {for (int ...

  10. LeetCode题库整理【Java】—— 2 两数相加

    LeetCode题库整理[Java] 2.两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果, ...

最新文章

  1. 浅谈ASP.net中的DataSet对象
  2. 解题代码 用jquery控制一个按钮当一次点击完之后5 秒后才能继续点击 验证码的制作...
  3. LeetCode Algorithm 204. 计数质数
  4. 大数据WEB阶段(十六)JavaEE三大 核心技术之监听器Listener
  5. Lucene5.5.4入门以及基于Lucene实现博客搜索功能
  6. SpringMVC请求参数乱码问题
  7. 【原】unity3D ios 退出保存数据(2)
  8. 疯狂软件mysql视频_疯狂软件MySql视频
  9. c语言学习-自定义并调用两个函数,分别求两个整数的最大公约数和最小公倍数
  10. c语言串的存储操作完整,c语言中关于串的相关知识以及操作
  11. 数据库学生管理系统课程设计
  12. 特洛伊木马程序_历史著名的特洛伊木马计,希腊的人造礼物
  13. ASP.NET在Web窗体上输出九九乘法表
  14. CPU的工作原理和内部架构
  15. android nmea 工具,android – 如何从nmea句子信息计算以米为单位的gps准确度
  16. 华为网络设备查询系统时间及修改系统时间命令
  17. 【云图说合集】阅识风云之云图说系列,是您了解华为云的必备利器
  18. Numpy基础+进阶+高级
  19. 网易免费企业(域名)邮箱注册及验证
  20. (3) Top 6 移动广告Mediation平台Admob Mopub Appodeal

热门文章

  1. USB驱动移植(u盘)
  2. python3生成自定义大小的图片
  3. 离谱!接私活被公司开除。。
  4. 【Python制作词云】改变词云字体颜色
  5. 上市六年亏损五年,飞鱼科技有什么魔力让腾讯两次增持?
  6. uniapp视频播放绿屏/花屏的问题
  7. 数字电子技术课程设计-八路抢答器
  8. vnc显示Linux主机用户桌面,用VNC实现Windows中显示Linux的桌面
  9. Google coLab使用说明 强烈推荐
  10. 保险后市场 为保险从业者减负经济压力