两数相加(java版本)
(一)、单链表实现
package com.lin.leetcode.addTwoNumbers; /**
* Created by Yaooo on 2019/8/26.
*/
public class ListNode {
int data;
ListNode next;
ListNode(int data){
this.data = data;
}
}
package com.lin.leetcode.addTwoNumbers; import java.util.List; /**
* Created by Yaooo on 2019/8/25.
*/
public class SingleLinkedList{ public int size;
public ListNode head; // head|next ->null
public SingleLinkedList(){
size = 0;
head = null;
} // head -> a|next ->b|next ->null
public void addData(int obj){
ListNode node = new ListNode(obj);
if(size == 0){
head = node;
node.data= obj;
}else{
node.next = head;
head = node;
node.data = obj;
}
size++;
}
// head -> a|next ->b|next ->c|next ->null
public boolean deleteData(int value){
if (size == 0){
return false;
}
ListNode current = head;
ListNode previous = head;
while(current.data!=value){
if (current.next == null){
return false;
}else{
previous = current;
current = current.next;
}
}
if(current == head){
head = current.next;
size--;
}else {
previous.next = current.next;
size--;
}
return true;
} public void display(){
ListNode node = head;
while (node!=null){
if (node.next==null){
System.out.print(node.data );
node = node.next;
}else{
System.out.print(node.data + "->");
node = node.next;
}
}
} public static void main(String[] args){
SingleLinkedList list = new SingleLinkedList();
list.addData(1);
list.addData(2);
list.addData(5);
list.deleteData(5);
list.display();
} }
实现单链表两数相加:
思路
我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。
图1,对两数相加方法的可视化: 342 + 465 = 807342+465=807,每个结点都包含一个数字,并且数字按位逆序存储。
算法
就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表 l1l1 和 l2l2 的表头开始相加。由于每位数字都应当处于 0 \ldots 90…9 的范围内,我们计算两个数字的和时可能会出现 “溢出”。例如,5 + 7 = 125+7=12。在这种情况下,我们会将当前位的数值设置为 22,并将进位 carry = 1carry=1 带入下一次迭代。进位 carrycarry 必定是 00 或 11,这是因为两个数字相加(考虑到进位)可能出现的最大和为 9 + 9 + 1 = 199+9+1=19。
伪代码如下:
- 将当前结点初始化为返回列表的哑结点。
- 将进位 carry 初始化为 0。
- 将 p 和 q 分别初始化为列表 l1 和 l2 的头部。
- 遍历列表 l1 和 l2 直至到达它们的尾端。
- 将 x 设为结点 p 的值。如果 pp 已经到达 l1 的末尾,则将其值设置为 0。
- 将 y 设为结点 qq 的值。如果 qq 已经到达 l2 的末尾,则将其值设置为 0。
- 设定 sum=x+y+carry。
- 更新进位的值,carry=sum/10。
- 创建一个数值为(sum mod 10) 的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
- 同时,将 p 和 q 前进到下一个结点。
- 检查carry=1 是否成立,如果成立,则向返回列表追加一个含有数字 11 的新结点。
- 返回哑结点的下一个结点。
请注意,我们使用哑结点来简化代码。如果没有哑结点,则必须编写额外的条件语句来初始化表头的值。
请特别注意以下情况:
测试用例 说明
package com.lin.leetcode.addTwoNumbers; import java.lang.reflect.Array; /**
* Created by Yaooo on 2019/8/25.
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dumpHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dumpHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.data : 0;
int y = (q != null) ? q.data : 0;
int sum = x + y + carry;
carry = sum / 10; curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry != 0){
curr.next = new ListNode(carry);
}
return dumpHead.next;
} public static void main(String[] args){
SingleLinkedList l1 = new SingleLinkedList();
l1.addData(1);
l1.addData(2);
l1.addData(5);
SingleLinkedList l2 = new SingleLinkedList();
l2.addData(3);
l2.addData(2);
l2.addData(7);
Solution solution = new Solution();
ListNode l3 = solution.addTwoNumbers(l1.head,l2.head);
while (l3!=null){
if(l3.next == null ){
System.out.print(l3.data);
l3 = l3.next;
}else{
System.out.print(l3.data+"->");
l3 = l3.next;
}
}
}
}
复杂度分析
时间复杂度:O(max(m,n)),假设 mm 和 nn 分别表示 l1l1 和 l2l2 的长度,上面的算法最多重复max(m,n) 次。
空间复杂度:O(max(m,n)), 新列表的长度最多为max(m,n)+1。
拓展
如果链表中的数字不是按逆序存储的呢?例如:
(3→4→2)+(4→6→5)=8→0→7
算法引用于链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
两数相加(java版本)的更多相关文章
- leetcode 2 两数相加 JAVA
题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...
- LeetCode02 - 两数相加(Java 实现)
LeetCode02 - 两数相加(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 题目描述 ...
- ✡ leetcode 167. Two Sum II - Input array is sorted 求两数相加等于一个数的位置 --------- java
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- LeetCode 2——两数相加(JAVA)
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- Java实现 LeetCode 445 两数相加 II
445. 两数相加 II 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会 ...
- Java实现 LeetCode 2 两数相加
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- 通过简单的两数相加体会hashmap的好处
目录 引入题目:两数相加 HashMap相关知识: Map集合 Map集合的特点 Map常用子类 HashMap集合 LinkedHashMap集合 Map集合的常用方法 Map集合的第一种遍历方式: ...
- 两数之和,两数相加(leetcode)
我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...
- LeetCode(2):Add Two Numbers 两数相加
Medium! 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头 ...
随机推荐
- nativescript(angular2)——ListView组件
NativeScript是一个不使用webview的情况下构建跨平台并且原生的iOS和Android应用.使用Angular.TypeScript或JavaScript来获得原生UI和性能体验,同时可 ...
- wepy_two
2.代码高亮WebStorm/PhpStorm(其他工具参见:wepy官网代码高亮) (1)打开Settings,搜索Plugins,搜索Vue.js插件并安装. (2) 打开Settings,搜索F ...
- MyEclipse项目向IDEA项目迁移
1.首先选择File->New->Project from Existing sources/Project form Version Control,如果项目在你的本地则选择 Proje ...
- Taro -- 使用 Redux 来进行全局变量的管理
前言 Redux是JavaScript 状态容器,提供可预测化的状态管理.一般来说,规模比较大的小程序,页面状态,数据缓存,需要管理的东西太多,这时候引入Redux可以方便的管理这些状态,同一数据,一 ...
- break语句、continue语句、goto语句的用法辨析
1.break语句 break语句常使用在switch语句.循环体以及if语句中,它的作用是跳出循环,而且只能跳出一层循环. for (i = 0; i < 10; ++j) { for (j ...
- 树——populating-next-right-pointers-in-each-node(填充每个节点的next指针)
问题: Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode ...
- python笔记(1)--基础知识
一.注释 单行注释 #打印“hello world” print("hello.world!") 另外一种单行注释 print("hello,world!") ...
- .OnCommand mfc
.OnCommand是响应WM_COMMAND消息的,一般是响应控件和菜单的命令消息时使用. 如果 WM_COMMAND 来自控件的话 lParam 就是发送这个 WM_COMMAND 消息的控件的句 ...
- js reduce用法
let books = [ 0, {bookName:"python",price:10,count:1}, {bookName:"Ruby",count:2, ...
- 搭建vue项目并启动vue项目
链接地址:https://blog.csdn.net/aa792978017/article/details/82939483 Vue.js是现在比较优秀的Web前端框架,下面开始从零开始搭建一个Vu ...