LeetCode - #2 Add Two Numbers

前言

我們社區從本期開始會將顧毅(Netflix 增長黑客,《iOS 面試之道》作者,ACE 職業健身教練。微博:@故胤道長)的 Swift 算法題題解整理爲文字版以方便大家學習與閱讀。

不積跬步,無以至千里;不積小流,無以成江海,Swift社區 伴你前行。

難度水平:中等

描述

已知兩個非負整數(例如:l1 = 342,l2 = 465),將數字分別按相反的順序存儲到鏈表中(例如:l1 = [2,4,3],l2 = [5,6,4]),每個節點都包含一個數字,將兩個數字相加並將總和作爲鏈表返回(例如:[7,0,8])。

假設這兩個數字不包含任何前導零(例如:012),除了數字 0 本身。

示例

示例 1

輸入:l1 = [2,4,3],l2 = [5,6,4]
產出:[7,0,8]
說明:342 + 465 = 807

示例 2

輸入:l1 = [0],l2 = [0]
產出:[0]

示例 3

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
產出:[8,9,9,9,0,0,0,1]

限制

  • 每個鏈表中的節點數在 [1, 100] 範圍內
  • 0 <= 節點值 <= 9
  • 保證列表中沒有前導零的數字

答案

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.next = nil
 *     }
 * }
 */
class AddTwoNumbers {
    func addTwoNumbers(l1: ListNode?, _ l2: ListNode?) -> ListNode? {
        guard let l1 = l1 else {return l2}
        guard let l2 = l2 else {return l1}
        
        let outputNode = ListNode((l1.val + l2.val)%10)
        if l1.val + l2.val > 9 {
            outputNode.next = addTwoNumbers(addTwoNumbers(l1.next, l2.next),
                                            ListNode(1))
        } else {
            outputNode.next = addTwoNumbers(l1.next, l2.next)
        }
        return outputNode
    }
}
  • 主要思想:使用進位並遍歷兩個鏈表
  • 時間複雜度:O(n)
  • 空間複雜度:O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章