(一)、单链表实现

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 直至到达它们的尾端。
  1. 将 x 设为结点 p 的值。如果 pp 已经到达 l1 的末尾,则将其值设置为 0。
  2. 将 y 设为结点 qq 的值。如果 qq 已经到达 l2 的末尾,则将其值设置为 0。
  3. 设定 sum=x+y+carry。
  4. 更新进位的值,carry=sum/10。
  5. 创建一个数值为(sum mod 10) 的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
  6. 同时,将 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版本)的更多相关文章

  1. leetcode 2 两数相加 JAVA

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

  2. LeetCode02 - 两数相加(Java 实现)

    LeetCode02 - 两数相加(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 题目描述 ...

  3. ✡ 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 ...

  4. LeetCode 2——两数相加(JAVA)

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

  5. Java实现 LeetCode 445 两数相加 II

    445. 两数相加 II 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会 ...

  6. Java实现 LeetCode 2 两数相加

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

  7. 通过简单的两数相加体会hashmap的好处

    目录 引入题目:两数相加 HashMap相关知识: Map集合 Map集合的特点 Map常用子类 HashMap集合 LinkedHashMap集合 Map集合的常用方法 Map集合的第一种遍历方式: ...

  8. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  9. LeetCode(2):Add Two Numbers 两数相加

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

随机推荐

  1. CtfStudying之SSH私钥泄露

    8/23/19 SSH私钥泄露 对于只是给定一个对应ip地址的靶场机器,我们需要对其进行扫描,探测其开放服务.我原来理解的渗透就是找到目标的漏洞,然后利用这些(这种)漏洞,最后拿到机器的最高权限:其实 ...

  2. linux手动测试 rsync 的同步情况

    特别强调:此步很关键,如果这不能同步,后面的 inotify 配好了也不会同步数据. 1) 分别创建待同步数据 [root@rsync-client-inotify ~]# mkdir /data/{ ...

  3. .net 项目中应用Web Services(vs2012)

    一.在asp.net项目中添加Web services1.新建一个asp.net项目(目前尚未验证是否可以在MVC项目中添加)2.在项目名上右击,选择添加→新建项→Web服务,输好名称后确定即可 二. ...

  4. xftp xshell 个人下载官网

    https://www.netsarang.com/zh/xftp-download/

  5. nginx的RPM包制作案例

    使用nginx-1.12.2版本的源码软件,生成对应的RPM包软件,具体如下: - 软件名称为nginx - 软件版本为1.12.2 - RPM软件包可以查询描述信息 - RPM软件包可以安装及卸载 ...

  6. jquery 模态对话框传值,删除,新增表格行

    个人的练习代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. Zabbix分布式监控系统实践

    https://www.zabbix.com/wiki/howto/install/Ubuntu/ubuntuinstall 环境介绍OS: Ubuntu 10.10 Server 64-bitSer ...

  8. 对async 函数的研究

    async 函数 1.ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Generator ...

  9. simulate 中的一些操作

    1. neutralize: position based 的alpha int neutralize(int di, int ti) { ; ; ; ; ii < nsyms; ++ii) { ...

  10. python学习笔记(九)内置函数

    print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 True print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真 True print( ...