感谢此作者
在这个基础上添加了一些注释,让以后的我能看懂。
还有未解决的地方。以后有时间在解决。
问题:
* 如何测试数组。现在只能单个文字的测试。
import UIKit
public class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
class WYSolution: NSObject {
func getValFromNode(_ node: ListNode?) -> Int {
if node == nil {
return 0
} else {
return node!.val
}
}
func getNextNode(_ node: ListNode?) -> ListNode? {
if node != nil {
return node!.next
} else {
return nil
}
}
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
// 1. 判断是否为空,如都为空,返回 nil
if (l1 == nil) && (l2 == nil) {
return nil
}
var ll1 = l1
var ll2 = l2
// 表头 设置为 0
let head = ListNode(0)
// 要对头结点进行操作时,考虑创建哑节点,这样可以避免处理头节点为空的边界问题。
var point = head
// 将进位 carry 初始化为 0
var carry = 0
while (ll1 != nil) || (ll2 != nil) || carry != 0 {
// 获取相加值
let total = getValFromNode(ll1) + getValFromNode(ll2) + carry
/*
由于每位数字都应当处于 0...9 的范围中,我们计算两个数字的和时可能会出现 “溢出”
例: 5 + 7 = 12
这种情况,会将当前数值设置为2, 并将进位 carry = 1 带入下次迭代。
*/
point.val = total % 10
// 更新进位的值
// 进位carry 必定是 0 或 1, 因为 两个数字相加 ,考虑进位,可能出现的最大和 为 9 + 9 + 1 = 19
carry = total / 10
// 如果已经到达 末尾,则将其值设置为 0
ll1 = getNextNode(ll1)
ll2 = getNextNode(ll2)
if (ll1 != nil) || (ll2 != nil) || (carry != 0) {
point.next = ListNode(0)
point = point.next!
}
}
return head
}
}
复杂度分析
时间复杂度:
- O(max(m,n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
空间复杂度:
- O(max(m,n)), 新列表的长度最多为 max(m,n)+1。