2. Add Two Numbers

本文介绍了一个解决LeetCode中两数相加问题的方法,通过遍历两个链表并处理进位,实现了链表形式的加法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源https://leetcode.com/problems/add-two-numbers/description/


给你两个非空链表,表示两个非负整数,这些数字以相反的顺序存储,每个节点包含一个数字,添加两个数字并将其作为一个链表返回。

你可以假设这两个数字不包含任何前导零,除了数字0本身。


解题思路,还是一样的先解题,不是最优解和没有解出来差距可是比最优解和不是最优解大远了。两个链表结构的对象,进行的数学计算,需要考虑的就是两个对象的长度不一致,和需要进位的问题,那么第一步先将两个对象给循环出来。如果和我一样对数据结构不那么熟悉的同学,不管怎么样,至少我们也要先看看这两个对象到底是个什么玩意不是?

fun main(args: Array<String>){
    val l1 = ListNode(3)
    l1.next = ListNode(4)
    l1!!.next!!.next = ListNode(2)
    l1!!.next!!.next!!.next = ListNode(5)
    l1!!.next!!.next!!.next!!.next = ListNode(1)

    val l2 = ListNode(4)
    l2.next = ListNode(6)
    l2!!.next!!.next = ListNode(5)

    addTwoNumbers(l1, l2)
}

fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
    var backL1 = l1
    var backL2 = l2
    //记录下来,看看是个什么东西
    val sbL1 = StringBuilder()
    val sbL2 = StringBuilder()
    while (backL1!=null || backL2 != null){
        //先循环完整个链表
        if(backL1 != null){
            sbL1.append(backL1.`val`)
            backL1 = backL1.next
        }
        if(backL2 != null){
            sbL2.append(backL2.`val`)
            backL2 = backL2.next
        }
    }
    println("第一个链表 L1为:$sbL1")
    println("第二个链表 L2为:$sbL2")
    return null
}
这样,我们就把两个链表给循环输出完了。接下来就是简单的数学运算,相加之后的结果除以10的余数就是这次相加之和的结果,10位上的数留作下次计算使用,接下来继续在上面代码基础上接着撸

fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
    var backL1 = l1
    var backL2 = l2
    var sum = 0//记录每次双加的结果
    val result = ListNode(0)//留下内存地址用来返回
    var tempResult = result//每次更新为最后一个ListNode
    while (backL1!=null || backL2 != null){
        sum /= 10//个位已经留作上次的结果,所以只需要留下10位数作为参与本次计算
        if(backL1 != null){
            sum += backL1.`val`
            backL1 = backL1.next
        }
        if(backL2 != null){
            sum += backL2.`val`
            backL2 = backL2.next
        }
        tempResult.`val` = sum % 10//留下个位作为本次计算结果,10位作为进位参与下次计算
        if(backL1!=null || backL2 != null){
            //如果还需进行下次循环,返回结果的ListNode才需要创建下一个对象
            tempResult.next = ListNode(0)
            tempResult = tempResult.next!!
        }
    }
    return result
}
这样就完成了吗?注意这个是while循环,而不是do while,假如最后一次计算需要进位的话,上面的代码是不会进行进位的。所以我们需要在最后补上一个if判断是否需要进位,最终代码如下

fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
    var backL1 = l1
    var backL2 = l2
    var sum = 0//记录每次双加的结果
    val result = ListNode(0)//留下内存地址用来返回
    var tempResult = result//每次更新为最后一个ListNode
    while (backL1!=null || backL2 != null){
        sum /= 10//个位已经留作上次的结果,所以只需要留下10位数作为参与本次计算
        if(backL1 != null){
            sum += backL1.`val`
            backL1 = backL1.next
        }
        if(backL2 != null){
            sum += backL2.`val`
            backL2 = backL2.next
        }
        tempResult.`val` = sum % 10
        if(backL1!=null || backL2 != null){
            //如果还需进行下次循环,返回结果的ListNode才需要创建下一个对象
            tempResult.next = ListNode(0)
            tempResult = tempResult.next!!
        }
    }
    if(sum > 9){
        tempResult.`val` = sum % 10
        tempResult.next = ListNode(sum / 10)
    }
    return result
}

最后调试一下输出结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值