给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并>且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
// 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
// 输出:7 -> 0 -> 8
// 原因:342 + 465 = 807
- 思路:从个位相加计算进位值和个位值拼接到链表next中
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(\max(m,n))O(max(m,n))
fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? {
if (l1 == null || l2 == null) {
return null
}
var temp1 = l1
var temp2 = l2
var carry = 0
var resultNode: ListNode? = null
var tempNode: ListNode? = null
while (temp1 != null || temp2 != null) {
val t1 = temp1?.`val` ?: 0
val t2 = temp2?.`val` ?: 0
val t12 = t1 + t2 + carry
// 个位
val bits = t12 % 10
if (resultNode == null) {
resultNode = ListNode(bits)
tempNode = resultNode
} else {
val node = ListNode(bits)
tempNode!!.next = node
tempNode = node
}
// 进位
carry = t12 / 10
temp1 = temp1?.next
temp2 = temp2?.next
// 最后一次如果有进位
if (carry > 0) {
tempNode.next = ListNode(carry)
}
}
return resultNode
}