算法篇:链表之两数相加
时间:2022-07-22
本文章向大家介绍算法篇:链表之两数相加,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法: 核心问题是进位的操作:
1)不要忘记进位之后的哪一个1;
2)不要忘记所有位都操作完了之后,最后的哪一个进位1
变形题目的话,需要想办法转换成 题目1这种原子操作的题目。
题目 1: 两数相加:
https://leetcode-cn.com/problems/add-two-numbers/
代码:
// 算法: 核心问题是:进位的操作,
// 1)不要忘记进位之后的哪一个1;
// 2)不要忘记所有位都操作完了之后,最后的哪一个进位1
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
h := new(ListNode)
pre,res := h,h
m, n := l1, l2
for m != nil && n != nil {
tmp := new(ListNode)
sum := m.Val + n.Val + res.Val
if sum >= 10 {
tmp.Val = 1
}
pre = res
res.Val = sum % 10
res.Next = tmp
res = res.Next
m = m.Next
n = n.Next
}
for m != nil {
tmp := new(ListNode)
s := m.Val + res.Val
if s >= 10 {
tmp.Val = 1
}
pre = res
res.Val = s % 10
res.Next = tmp
res = res.Next
m = m.Next
}
for n != nil {
tmp := new(ListNode)
s := n.Val + res.Val
if s >= 10 {
tmp.Val = 1
}
pre = res
res.Val = s % 10
res.Next = tmp
res = res.Next
n = n.Next
}
if res.Val == 0 {
pre.Next = nil
}
return h
}
运行结果:
题目 2: 两数之和:
https://leetcode-cn.com/problems/sum-lists-lcci/
代码实现:
// 算法:实现方式与题目1一致,
// 本题代码相当于对题目1的解法做了一个代码层面的优化
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
res := new(ListNode)
n := res
r := 0
// 相同位的计算
for l1 != nil && l2 != nil {
s:= r + l1.Val + l2.Val
if s >= 10 {
r = 1
} else {
r = 0
}
tmp := ListNode{Val:s%10}
res.Next = &tmp
l1 = l1.Next
l2 = l2.Next
res = res.Next
}
// 位数不同的两个数的,高位数计算
var result *ListNode
if l1 != nil {
result = l1
} else if l2 != nil {
result = l2
}
for result != nil {
s:= r + result.Val
if s >= 10 {
r = 1
} else {
r = 0
}
tmp := ListNode{Val:s%10}
res.Next = &tmp
result = result.Next
res = res.Next
}
// 最后的进位
if r != 0 {
tmp := ListNode{Val:r}
res.Next = &tmp
}
return n.Next
}
执行结果:
题目 3 :两数相加
https://leetcode-cn.com/problems/add-two-numbers-ii/
// 算法:
// 核心点在于,链表的低位是数字的高位,只要能够将链表的高低位交换,就变成题目1.
// 采用数组顺序性去实现高低位的反转,从数组末尾遍历就可以了。
// 剩下的思路与题目1一致。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
var a,b,c []*ListNode
for l1 != nil {
a = append(a,l1)
l1 = l1.Next
}
for l2 != nil {
b = append(b,l2)
l2 = l2.Next
}
c = Sum(a,b)
res := new(ListNode)
n := res
for i := len(c)-1;i>=0;i-- {
res.Next = c[i]
res = res.Next
}
return n.Next
}
func Sum(a,b []*ListNode) (c []*ListNode){
r := 0
i, j := len(a)-1,len(b)-1
for i>=0 && j >=0 {
s := r + a[i].Val+b[j].Val
tmp := new(ListNode)
tmp.Val = s%10
c = append(c,tmp)
if s >= 10 {
r = 1
} else {
r = 0
}
i--
j--
}
for i >= 0{
s := r + a[i].Val
tmp := new(ListNode)
tmp.Val = s%10
if s >= 10 {
r = 1
} else {
r = 0
}
c = append(c,tmp)
i--
}
for j >= 0{
s := r + b[j].Val
tmp := new(ListNode)
tmp.Val = s%10
if s >= 10 {
r = 1
} else {
r = 0
}
c = append(c,tmp)
j--
}
if r != 0 {
c = append(c,&ListNode{Val:r})
}
return c
}
运行结果:
- Spring读书笔记——bean创建(下)
- 当区块链遇上传统行业 我们的生活和工作会改变吗?
- 如何设计开发好一个 HTTP API?
- [WCF权限控制]基于Windows用户组的授权方式[下篇]
- Spring读书笔记——bean解析
- 10个大数据误区,看看你中了几个?
- 从数据到代码——通过代码生成机制实现强类型编程[上篇]
- Spring读书笔记——bean加载
- Java8-初识Lambda
- 我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- 我的WCF之旅(4):WCF中的序列化[下篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-FittedBox篇
- muduo Dispatcher消息分发器 通过多态和模板进行向上类型转换
- Flutter基础widgets教程-FloatingActionButton篇
- VBS基础篇 - 对象(3) - FileSystemObject对象
- vbs 实现文件夹拷贝--采用堆栈不递归
- vbs - 一个简单的栈 -- 只能存储类对象
- Flutter基础widgets教程-FlutterLogo篇
- 配置压缩版mysql 5.7以上版本
- nutz 自定义sql的使用
- nutz 中 子模块 参数的使用。
- java向mysql插入数据乱码问题解决
- java向数据库中插入中文出现乱码
- Flutter基础widgets教程-FractionallySizedBox篇
- 关于myeclipse控制台输出中文乱码的问题
- nutz 自定义查询 分页 取值