LeetCode - 两数相加 - Swift

感谢此作者
在这个基础上添加了一些注释,让以后的我能看懂。
还有未解决的地方。以后有时间在解决。
问题:
* 如何测试数组。现在只能单个文字的测试。

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。

猜你喜欢

转载自blog.csdn.net/M316625387/article/details/82416648