题目:两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
来源:力扣(LeetCode)
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
拓展:如果是按照逆序呢?例如834=(8->3->4)
分析
这道题目思路很简单,再创建一个链表,然后记住进位,最后把剩下的接到后面即可。
关于拓展题目,使用递归或者栈来把顺序颠倒即可。
解答
/**
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
class Solution {
fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
if (l1==null||l2==null) return null
val numString = StringBuilder()
var carry = 0
var link1:ListNode? = l1
var link2:ListNode? = l2
while (link1!=null||link2!=null){
val one = link1?.`val` ?: 0
val two = link2?.`val` ?: 0
var add = one+two+carry
if (add>=10){
carry = 1
add %= 10
}else carry = 0
numString.append(add)
link1?.let { link1 = it.next }
link2?.let { link2 = it.next }
}
if (carry==1) numString.append(1)
val linkNode : ListNode = ListNode(numString[0].toInt()-48)
var point = linkNode
for (i in 1 until numString.length){
val node = ListNode(numString[i].toInt()-48)
point.next = node
point = node
}
point.next = null
return linkNode
}
}