[LeetCode] 2. Add Two Numbers / Swift
[문제 보기]
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:

Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0] Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] Output: [8,9,9,9,0,0,0,1]
Constraints:
- The number of nodes in each linked list is in the range [1, 100].
- 0 <= Node.val <= 9
- It is guaranteed that the list represents a number that does not have leading zeros.
https://leetcode.com/problems/add-two-numbers/
Add Two Numbers - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
첫번째 방법
// 첫번째 버전
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var cur1 = l1
var cur2 = l2
var buffer = 0
let start = ListNode()
var ansCur = start
while cur1 != nil && cur2 != nil {
ansCur.next = ListNode()
ansCur = ansCur.next!
let val = cur1!.val + cur2!.val + buffer
ansCur.val = val % 10
buffer = val / 10
cur1 = cur1?.next
cur2 = cur2?.next
}
if cur1 == nil && cur2 == nil && buffer == 0 {
return start.next
}
var p = cur1
if p == nil {
p = cur2
}
while p != nil || buffer > 0 {
let val = (p?.val ?? 0) + buffer
ansCur.next = ListNode(val % 10)
ansCur = ansCur.next!
p = p?.next
buffer = val / 10
}
return start.next
}
}
첫번째 방법에서 수정한 방법:
기존 방법: while문에서 두개의 커서가 모두 nil이 아닐때까지 반복
수정한 방법: while문에서 두개의 커서가 모두 nil이 될때까지 반복. 이 방법은 while문 종료후에 nil이 아닌 어느 한쪽을 따로 이어주는 부분이 없음. 수행시간은 두번째 방법(52ms)보다 첫번째 방법(44ms)이 더 좋았음
// 두번째 버전
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init() { self.val = 0; self.next = nil; }
* public init(_ val: Int) { self.val = val; self.next = nil; }
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
* }
*/
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var cur1 = l1
var cur2 = l2
var buffer = 0
let start = ListNode()
var ansCur = start
while cur1 != nil || cur2 != nil {
ansCur.next = ListNode()
ansCur = ansCur.next!
let val = (cur1?.val ?? 0) + (cur2?.val ?? 0) + buffer
ansCur.val = val % 10
buffer = val / 10
cur1 = cur1?.next
cur2 = cur2?.next
}
if buffer > 0 {
ansCur.next = ListNode(buffer)
}
return start.next
}
}