当前位置:网站首页>【LeetCode】2. 两数相加 - Go 语言题解
【LeetCode】2. 两数相加 - Go 语言题解
2022-07-20 11:01:00 【想变厉害的大白菜】
一、题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
题目链接:https://leetcode.cn/problems/add-two-numbers/
二、解题思路
数字在链表中的存储顺序按从前到后依次是:个位,十位,百位,…
两数相加的时候,我们也是从个位数开始加的,产生进位则进到十位…
可见链表的存储顺序和我们进行加法运算的顺序是相符合的,我们只要从表头开始相加,进位进到下一位(Next节点)即可…
该题的难点主要在 进位 的处理上,关键点:
- 如果数字相加的结果 大于9 就会产生进位,
- 相加的时候应该是:v1+v2+进位
- 相加的 每一步 都可能产生进位
三、我的题解
我的 Go 语言代码:
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil && l2 == nil{
return nil
}else if l1 == nil{
return l2
}else if l2 == nil{
return l1
}
c1 := l1 //当前l1节点
b1 := l1 //当前l1节点的前驱节点
c2 := l2 //当前l2节点
b := 0 //进位
//都非空,先处理头节点
if c1.Val + c2.Val <= 9{
c1.Val = c1.Val + c2.Val
c1 = c1.Next
c2 = c2.Next
}else{
b = (c1.Val + c2.Val)/10
c1.Val = (c1.Val + c2.Val)%10
c1 = c1.Next
c2 = c2.Next
}
//处理后面的节点
for c1 != nil && c2 != nil{
if c1.Val + c2.Val + b <= 9{
c1.Val = c1.Val + c2.Val + b
b = 0 //进位归0
c1 = c1.Next
b1 = b1.Next
c2 = c2.Next
}else{
newb := (c1.Val + c2.Val + b)/10 //新的进位
c1.Val = (c1.Val + c2.Val + b)%10
b = newb
c1 = c1.Next
b1 = b1.Next
c2 = c2.Next
}
}
if b != 0{
//进位不为空
if c1 == nil && c2 == nil{
var newnode ListNode
newnode.Val = b
b1.Next = &newnode
return l1
}else if c2 == nil{
for b != 0 {
c1,b = jinwei(c1, b)
c1 = c1.Next
}
return l1
}else if c1 == nil{
t2 := c2
for b != 0 {
c2,b = jinwei(c2,b)
c2 = c2.Next
}
b1.Next = t2
return l1
}
}else{
//进位为空,直接返回
if c1 == nil && c2 == nil{
return l1
}else if c2 == nil{
return l1
}else if c1 == nil{
b1.Next = c2
return l1
}
}
return l1
}
//进位函数,将进位b加到当前节点上,返回当前节点的新值和产生的新进位
func jinwei(l1 *ListNode, b int) (*ListNode,int){
if l1.Val + b <= 9{
l1.Val = l1.Val + b
return l1,0
}else{
if l1.Next != nil{
newb := (l1.Val + b)/10
l1.Val = (l1.Val + b)%10
return l1,newb
}else{
newb := (l1.Val + b)/10
l1.Val = (l1.Val + b)%10
var newnode ListNode
newnode.Val = newb
l1.Next = &newnode
return l1,0
}
}
}
评判结果:
边栏推荐
猜你喜欢
[the problem has been solved] - Jenkins login exsi host without secret
Section 5 of Chapter 1: importance of notes
解密方舟的高性能内存回收技术——HPP GC
运算符优先级与求值次序(从上至下)
深入理解String类
Pyspark:DataFrame的转化操作及行动操作
Jenkins pipeline downloads the code to the specified workspace
标量、向量、矩阵微积分
Section 12 of Chapter 1: use of break and continue
[jenkins]- pipelined loop outputs each line in text parameter
随机推荐
使用ECS和OSS搭建个人网盘
Understand what configuration center is?
Win10 boot PS1 script
Function introduction
基于Tensorflow GPU2Ascend工具的TensorFlow网络模型迁移
后深度学习时代,推荐系统向何处去?
加密市场中的14个心智模型
用 emoji 学安全上网小常识?看 Google 新玩法
笔记。。。。
Use Emoji to learn common sense of safe Internet access? See the new play of Google
实验。。。。
Jenkins pipeline downloads the code to the specified workspace
理解什么是配置中心?
华人女婿小野三太成密西根大学首位亚裔校长,年薪超650万!
Jackson 动态过滤属性,编程式过滤对象中的属性
视频分析StreamEye Studio
着力提升妇儿获得感、幸福感、安全感!未来十年广州妇女儿童事业这样发力
亮点抢先看!2022 开放原子全球开源峰会定于 7 月 25-29 日在北京举办
Nacos服务发现数据模型
Section 10 of Chapter 1: conditional judgment if