Java算法练习——两数相加
题目链接
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题解
/**
* 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 q = l1, p = l2;
ListNode dummyHead = new ListNode(0);
ListNode carr = dummyHead;
int carry = 0;
while (q != null || p != null) {
int x = q != null ? q.val : 0;
int y = p != null ? p.val : 0;
int sum = x + y + carry;
carry = sum / 10;
carr.next = new ListNode(sum % 10);
carr = carr.next;
if (q != null) q = q.next;
if (p != null) p = p.next;
}
if (carry > 0) {
carr.next = new ListNode(carry);
}
return dummyHead.next;
}
}
手记
carry(进位)是一个很重要的变量,两个一位数相加,进位只可以是 0 或 1 ,两个数相加再加前数的进位,最大值也只为 19,例如 96 + 97,个位相加:得 3 进 1,十位相加为:9 + 9 + 1 = 19。
再看此题,链表为逆序存储数字,我们读取数字时,就是从最低位开始的,这符合我们的运算习惯。我们每读取两个链表的各一位数字,便将它们与前进位相加,结果超过 10 的部分为本次运算的进位,不超过 10的部分为本次运算留在本位的值,只要两个链表有一个不为空,两个链表将再次进位计算。
30行代码表示,如果计算结束,但上次进位值大于 0(值为 1),则将进位补到最高位。
附
很不错的题,优解的写法看的让人着迷。
以上
Java算法练习——两数相加的更多相关文章
- Java算法练习——两数之和
题目链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...
- PHP算法之两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- golang 算法题 : 两数相加
package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func main() { l1 := ...
- 两数相加(java版本)
(一).单链表实现 package com.lin.leetcode.addTwoNumbers; /** * Created by Yaooo on 2019/8/26. */ public cla ...
- ✡ 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.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- 两数相加(C#数据结构和算法练习)
两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode 2——两数相加(JAVA)
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- LeetCode02 - 两数相加(Java 实现)
LeetCode02 - 两数相加(Java 实现) 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 题目描述 ...
随机推荐
- 201706 gem 'rails-erd'生成Model关系图
[工具]一张图理清各个model之间关系 安装 Graphviz 2.22+: 终端机中执行 brew install graphviz Gemfile中添加 gem 'rails-erd' 终端机中 ...
- 关于AlertDialog多选框中全选和反选的实现办法
package mobile.android.ch07.multi.choice.dialog; import android.app.Activity; import android.app.Ale ...
- 怎样设置使IntelliJ IDEA智能提示忽略大小写?
打开设置(CTRL+ALT+S)打开editor,找到“Code Completion”->点击Match case前面的框不勾选即可.如下图:
- 序列号导出到csv的实现
//导出到csv public function exportCsvByIds($ids){ header("Content-type:text/html;charset=utf-8&quo ...
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:定时调度
// 完成具体的任务操作 import java.util.TimerTask ; import java.util.Date ; import java.text.SimpleDateFormat ...
- (分治)输出前m大的数。。。
描述给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出.输入第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一个空格分开 ...
- 2.8 学习总结 之 JQ初识
一.说在前面 昨天 学习了kotlin的相关知识 今天 学习JQ Jquery它是javascript的一个轻量级框架,对javascript进行封装,它提供了很多方便的选择器.供你快速定位到需要操作 ...
- 索尼研发的新主机竟兼容现款PSVR!
索尼PlayStation研发负责人Dominic Mallinson在接受媒体记者采访时表示,现款PSVR头戴式虚拟现实装置可用于下一代PS主机. 新主机兼容现款PSVR 而且,即便新主机上市也不要 ...
- jsp采用ajax传递数组给后台controller并遍历
ajax传递数组,期间出各种各样的问题,那叫一个头疼,网上各种查,都没有解决,最终摸索摸索加借鉴搞定,不多说,上代码 /* 复选框选定部分 */ $("#delete").clic ...