一、题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
二、解法
复杂度分析
时间复杂度:O(max(m,n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
空间复杂度:O(max(m,n)), 新列表的长度最多为 max(m,n)+1。
func addTwoNumbers(l1:ListNode?, l2:ListNode?) -> ListNode? {
var node1 = l1
var node2 = l2
var headNode: ListNode?
var nextNode: ListNode?
var carry: Int = 0
while node1 != nil || node2 != nil {
let node1val = node1?.val ?? 0
let node2val = node2?.val ?? 0
node1 = node1?.next
node2 = node2?.next
var sum = node1val + node2val + carry
carry = sum < 10 ? 0 : 1
sum = sum % 10
if nextNode == nil {
nextNode = ListNode.init(val: sum)
headNode = nextNode
} else {
nextNode?.next = ListNode.init(val: sum)
nextNode = nextNode?.next
}
}
if carry != 0 {
nextNode?.next = ListNode.init(val: carry)
}
return headNode
}