【问题描述】445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

【解答思路】

1. 常规思路 链表反转 然后按位相加 (入门)

时间复杂度:O(N) 空间复杂度:O(1)

/*** 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) {//反转链表ListNode newl1 =reverse(l1);ListNode newl2 =reverse(l2);//处理进位 累加的和是否有超过10进位的情况int carry = 0;ListNode l3 = null;while(newl1!= null || newl2 != null|| carry!=0){int n1=0 , n2 = 0;//反转后的链表取值并求和if(newl1 == null){n1 = 0;}else{n1 = newl1.val;newl1 = newl1.next; }if(newl2 == null){n2 = 0;}else{n2 = newl2.val;newl2 = newl2.next; }int sum = n1 + n2+ carry;//头插法 根据和求当前位置的值 和 进位的值 并连接上链表 ListNode tmp  =  new ListNode(sum%10);tmp.next = l3;l3 = tmp;carry =  sum /10;}return l3;}/*将给定头结点的链表反转*/private ListNode reverse(ListNode head){ListNode pre  = null;while(head!=null){ListNode next = head.next;head.next = pre;pre = head;head = next;}return pre;}
}
2. 逆序- 栈思想 (进阶)

时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {/*//java stack源码 推荐栈相关的用ArrayDeque类来实现 遵循官方建议所以用ArrayDequeDeque<Integer> stack1 = new ArrayDeque<Integer>();Deque<Integer> stack2 = new ArrayDeque<Integer>();*/Stack<Integer> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();//将两个链表分别入栈while(l1!=null){stack1.push(l1.val);l1=l1.next;}while(l2!=null){stack2.push(l2.val);l2= l2.next;}int carry =0;ListNode after = null;while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){//栈先进后出的性质 所以取出的是最后入栈的元素 并求和int n1 = stack1.isEmpty()?0:stack1.pop();int n2 = stack2.isEmpty()?0:stack2.pop();int sum = n1+n2+carry;//根据和求当前位置的值 和 进位的值 并连接上链表ListNode tmp = new ListNode(sum%10);tmp.next = after;after = tmp;carry=sum/10;}return after;}
}

【总结】

1.反转链表 头插法(多画图理解)
   /*将给定头结点的链表反转*/private ListNode reverse(ListNode head){ListNode pre  = null;while(head!=null){ListNode next = head.next;head.next = pre;pre = head;head = next;}
2. 逆序- 栈思想
3. 三目运算符(逻辑极度清晰的时候使用)

<表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是:先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。

[Leedcode][JAVA][第445题][链表][栈]相关推荐

  1. [Leedcode][JAVA][第155题][最小栈][基本类型包装类]

    [问题描述] [解答思路] 1. 两个栈实现 1.1.辅助栈和数据栈同步 特点:编码简单,不用考虑一些边界情况,就有一点不好:辅助栈可能会存一些"不必要"的元素. 1.2.辅助栈和 ...

  2. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  3. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  4. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  5. [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]

    [问题描述][第25题][K个一组反转链表][困难] 时间复杂度:O(N^2) 空间复杂度:O(1) ```java 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数, ...

  6. [剑指offer]面试题第[25]题[Leedcode][JAVA][第21题][合并两个有序链表]

    [问题描述][简单] 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1-&g ...

  7. [Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]

    [问题描述][困难] 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 .求在该柱状图中,能够勾勒出来的矩形的最大面积.以上是柱状图的示例,其中每个柱子的宽度为 1 ...

  8. [Leedcode][JAVA][第394题][字符串解码][栈][类型转换]

    [问题描述][中等] 给定一个经过编码的字符串,返回它解码后的字符串.编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k ...

  9. [Leedcode][JAVA][第355题][设计推特][面向对象][哈希表][链表][优先队列]

    [问题描述]355 设计推特 设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文.你的设计需要支持以下的几个功能:post ...

最新文章

  1. Redis知识点汇总
  2. Hadoop-2.4.1学习之edits和fsimage查看器
  3. js实现HTML标题栏中新消息提示效果
  4. C++ 静态成员函数
  5. 基于Matlab的跨孔CT胖射线追踪算法(五)
  6. c/c++面试题(1)
  7. c语言ch能储存多少字符,二级c语言程序设计习题与解答ch5-7函数字符(11页)-原创力文档...
  8. 新手降NAT网络第十步曲,小编提供思路。
  9. python调用win32api详解_Python调用Win32 API实现截图
  10. matlab语音去除白噪声_matlab去除高斯白噪声
  11. 2015-5-10分享pdf
  12. 揭露北京车牌租赁公司的内幕
  13. 程序员小抄——GitHub 热点速览 Vol.44
  14. Linux iptables MASQUERADE的作用
  15. 草莓换个做法,迫不及待想要吃
  16. android sdk 配置出错error: unknown argument --licenses
  17. 菜鸟成长手册:路由器技术深入剖解
  18. java反射机制原理,为什么需要反射,反射的作用
  19. setInterval()与setTimeout() 详细
  20. 深度学习之 自然语言处理BERT

热门文章

  1. Controller的返回值
  2. iOS屏幕尺寸和分辨率了解
  3. jquery中邮箱地址 URL网站地址正则验证实例代码
  4. 批量下载baidu音乐主页的歌曲
  5. linux中配置phpcms v9 中的sphinx
  6. PMP读书笔记(第12章)
  7. Mac安装brew及报错处理办法
  8. 动静分离-静态资源缓存控制
  9. centos使用git安装nvm
  10. java错误switch找不到符号,Java使用StringBuilder时--找不到符号