【Golang】LeetCode 2. 两数相加

2. 两数相加

题目描述

思路

这道题相当于在链表上实现两数相加,还是比较简单的,尤其是题目中一开始给我们的链表就是已经被翻转好的链表,并且最终要返回的也是被翻转后的结果(其实要是没有反转也不难,只要调用一下反转链表的模版就解决了)。

我们不使用额外的链表存储结果,而是直接将结果保存到l1链表当中。

一开始,我们新建一个整型变量cnt := 0,用于保存进位(它的值只可能是0 / 1)。新建三个指针,分别是p, q, prev := l1, l2, l1。p, q指针没什么好说的,我们需要用他俩来对链表进行遍历;值得关注的是prev指针,它的作用是记录p节点的前序节点(一开始也可以被初始化为(*ListNode)(nil),但是太麻烦了,索性直接使用l1)。

接下来我们开始对链表进行遍历,每次计算curr := p.Val + q.Val + cnt的值,然后取当前位的值curr = curr % 10以及进位值cnt = cnt / 10,并同时向后移动两个节点。特别需要注意的是,移动两个节点之前,需要先设置prev = p,也就是让prev指向移动p之后的前序节点。

基于p, q对链表进行遍历之后,如果链表不等长,那么p / q会停留在中间的某个节点上。如果l1链表更长,那么我们继续对p进行处理即可。否则,我们先令prev.Next, p = q, q,也就是将当前q节点及其之后的节点拼接到prev之后(此时p == nil),然后令p指向当前的q,以继续对l1所在的链表进行处理。

基于上面这个操作,接下来我们对p的处理是统一的。我们对p进行后移,条件是p != nil && cnt != 0。此时q == nil,在计算当前的和时,只需要计算curr = p.Val + cnt即可,之后维护cnt和curr,然后维护prev和p后移即可。

最后,如果cnt != 0,就说明在最后一位有进位,当前指向最后一个节点的指针是prev,我们令prev.Next = new(ListNode)并令这个节点的值为1即可完成本题。

基于以上思路,我们写代码来解决问题。

Golang 题解

go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    cnt := 0
    p, q, prev := l1, l2, l1
    for p != nil && q != nil {
        curr := p.Val + q.Val + cnt
        cnt = curr / 10
        curr = curr % 10

        p.Val = curr

        prev = p
        p = p.Next
        q = q.Next
    }

    if q != nil {
        prev.Next = q
        p = q
    }

    for p != nil && cnt != 0 {
        curr := p.Val + cnt
        cnt = curr / 10
        curr %= 10
        
        p.Val = curr
        prev = p
        p = p.Next
    }

    if cnt != 0 {
        prev.Next = new(ListNode)
        prev.Next.Val = 1
    }

    return l1
}
相关推荐
dialect_13 小时前
KMP算法
开发语言·c++·算法
总要学点什么14 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
文丑颜不良啊14 小时前
LeetCode1481~1500题目解析
java·leetcode
文丑颜不良啊15 小时前
LeetCode1381~1400题目解析
java·leetcode
开开心心_Every15 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c15 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌15 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
超级架构师17 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮17 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔18 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节