注意:有一种好的方法,是将链表倒转,然后依次相加。

但是,按照题目要求,用了不改变原链表的方法。

就是将两个链表增加到相同长度,然后递归相加,子函数返回后处理进位。

https://leetcode.com/problems/add-two-numbers-ii/

  1. package com.company;
  2.  
  3. import java.util.*;
  4.  
  5. class ListNode {
  6. int val;
  7. ListNode next;
  8. ListNode(int x) { val = x; }
  9. }
  10. class Solution {
  11.  
  12. ListNode addTwo(ListNode l1, ListNode l2) {
  13. //System.out.printf("add two %d, %d \n", l1.val, l2.val);
  14. ListNode ret = new ListNode(l1.val + l2.val);
  15. if (l1.next != null && l2.next != null) {
  16. ret.next = addTwo(l1.next, l2.next);
  17. ret.val += ret.next.val / 10;
  18. ret.next.val = ret.next.val % 10;
  19. }
  20. else {
  21. ret.next = null;
  22. }
  23. return ret;
  24. }
  25.  
  26. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  27. int l1len = 0;
  28. ListNode ln = l1;
  29. while (ln != null) {
  30. l1len++;
  31. ln = ln.next;
  32. }
  33. int l2len = 0;
  34. ln = l2;
  35. while (ln != null) {
  36. l2len++;
  37. ln = ln.next;
  38. }
  39. if (l1len < l2len) {
  40. ln = l1;
  41. l1 = l2;
  42. l2 = ln;
  43. l1len = l1len ^ l2len;
  44. l2len = l1len ^ l2len;
  45. l1len = l1len ^ l2len;
  46. }
  47.  
  48. for (int i=0; i<l1len-l2len; i++) {
  49. ln = new ListNode(0);
  50. ln.next = l2;
  51. l2 = ln;
  52. }
  53.  
  54. ln = addTwo(l1, l2);
  55. if (ln.val >= 10) {
  56. ListNode newHead = new ListNode(ln.val / 10);
  57. ln.val = ln.val % 10;
  58. newHead.next = ln;
  59. ln = newHead;
  60. }
  61. return ln;
  62. }
  63. }
  64.  
  65. public class Main {
  66.  
  67. public static void main(String[] args) {
  68. System.out.println("Hello!");
  69. Solution solution = new Solution();
  70.  
  71. ListNode l1 = new ListNode(7);
  72. ListNode l11 = new ListNode(2);
  73. ListNode l12 = new ListNode(4);
  74. ListNode l13 = new ListNode(3);
  75. l1.next = l11;
  76. l11.next = l12;
  77. l12.next = l13;
  78. ListNode l2 = new ListNode(5);
  79. ListNode l21 = new ListNode(6);
  80. ListNode l22 = new ListNode(4);
  81. l2.next = l21;
  82. l21.next = l22;
  83. ListNode ret = solution.addTwoNumbers(l1, l2);
  84. System.out.printf("Get ret: \n");
  85. while (ret != null) {
  86. System.out.printf("%d", ret.val);
  87. ret = ret.next;
  88. }
  89. System.out.println();
  90.  
  91. /*Iterator<List<Integer>> iterator = ret.iterator();
  92. while (iterator.hasNext()) {
  93. Iterator iter = iterator.next().iterator();
  94. while (iter.hasNext()) {
  95. System.out.printf("%d,", iter.next());
  96. }
  97. System.out.println();
  98. }*/
  99.  
  100. System.out.println();
  101.  
  102. }
  103. }

add-two-numbers-ii的更多相关文章

  1. [LeetCode] 445. Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  2. LeetCode 445. 两数相加 II(Add Two Numbers II)

    445. 两数相加 II 445. Add Two Numbers II 题目描述 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个 ...

  3. 445. Add Two Numbers II - LeetCode

    Question 445. Add Two Numbers II Solution 题目大意:两个列表相加 思路:构造两个栈,两个列表的数依次入栈,再出栈的时候计算其和作为返回链表的一个节点 Java ...

  4. LeetCode 445 Add Two Numbers II

    445-Add Two Numbers II You are given two linked lists representing two non-negative numbers. The mos ...

  5. [LeetCode] Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  6. LeetCode Add Two Numbers II

    原题链接在这里:https://leetcode.com/problems/add-two-numbers-ii/ 题目: You are given two linked lists represe ...

  7. 【LeetCode445】 Add Two Numbers II★★

    题目描述: 解题思路: 给定两个链表(代表两个非负数),数字的各位以正序存储,将两个代表数字的链表想加获得一个新的链表(代表两数之和). 如(7->2->4->3)(7243) + ...

  8. 【LeetCode】445. Add Two Numbers II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 先求和再构成列表 使用栈保存节点数字 类似题目 日期 ...

  9. 445. Add Two Numbers II ——while s1 or s2 or carry 题目再简单也要些测试用例

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  10. [Swift]LeetCode445. 两数相加 II | Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...

随机推荐

  1. hash --C++

    题目来源:code[VS] 这是一个极其无聊的hash题.... 1230 元素查找 题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出 ...

  2. java collections

    http://www.docjar.com/docs/api/java/util/technotes/guides/collections/changes4.html http://www.docja ...

  3. 对cnblogs.com用户体验的评价

    一.对于cnblogs.com的用户体验我们先对以下问题进行回答: 1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是正在学习软件工程课程的在校计算机专业大学生,在博 ...

  4. android聊天,存储聊天记录sqlite

    项目中有聊天模块,需要用到打开activity的时候初始化聊天记录的情况.大致情况如下: 辅助类:ChatSQLiteHelper   在第一次时会调用oncreate方法(判断的标准是schedul ...

  5. [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化

    重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也 ...

  6. android studio 智能提示忽略大小写

    Step1: Step2:

  7. 2391: Cirno的忧郁 - BZOJ

    Description Cirno闲着无事的时候喜欢冰冻青蛙.Cirno每次从雾之湖中固定的n个结点中选出一些点构成一个简单多边形,Cirno运用自己的能力能将此多边形内所有青蛙冰冻.雾之湖生活着m只 ...

  8. IntelliJ IDEA 调试小记

    一.IntelliJ IDEA 调试没有F6 Eclipse调试有F6,意为下一步,递增F8.可IntelliJ IDEA 调试没有这个. 二.图解 Step Over (F8): 下一步 (相当于E ...

  9. 解决Ubuntu开机自动挂载硬盘回收站不可用等权限问题

    1.修改fstab sudo gedit /etc/fstab 2.添加如下代码 #Entry for /dev/sdb7 : UUID=78A675EB46D703C4 /media/anseey/ ...

  10. 20160725noip模拟赛“Paodekuai” alexandrali

    T1: 我们可以用火柴棒来表示十进制下的0~9, 如图所示 现给定火柴数n, 问用这n根火柴能组成的最小数和最大数分别是多少. 所有火柴必须全部用完, 并且所有数字必须是正的且不含前缀零. [解题] ...