1. 程式人生 > >LeetCode - 兩數相加 - Swift

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。