题目来源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
}
最后调试一下输出结果: