https://leetcode.com/problems/add-two-numbers/description/
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? {
// 리턴할 노드
let answerNode = ListNode()
// 리턴할 노드의 포인터
var answerPoint: ListNode? = answerNode
// 리턴할 노드의 이전을 가르키는 포인터
var prevPoint: ListNode? = nil
// 매개변수로 주어지는 2개의 노드를 가르키는 포인터
var firstPoint = l1
var secondPoint = l2
// 두 수를 더했을 때 올림이 있는지 체크
var upper = false
// 반복하며 두 노드의 숫자를 더해서 answerPoint.val에 저장
// 만약 10보다 크면 upper true로하고
// upper가 true면 sum에 1을 추가함, upper 다시 false로
//
// 이후에 first, second 포인터 모두 next를 가르키게함
// 만약 first랑 second 둘다 비어있고 올림이 없다면 끝내야함
// 그게 아니면 prev에 지금 값 넣고 answerPoint를 next로
//
// 반복이 끝났다면 마지막 노드를 nil로 해야함
// 아니면 nil이 아닌 빈 노드를 가르키게 했기 때문.
while true {
var sum = (firstPoint?.val ?? 0) + (secondPoint?.val ?? 0)
if upper {
sum += 1
upper = false
}
if sum >= 10 {
sum -= 10
upper = true
}
answerPoint?.val = sum
firstPoint = firstPoint?.next
secondPoint = secondPoint?.next
if firstPoint == nil && secondPoint == nil && !upper {
break
}
answerPoint?.next = ListNode()
prevPoint = answerPoint
answerPoint = answerPoint?.next
}
if answerPoint?.val == 0 {
prevPoint?.next = nil
}
return answerNode
}
}
링크드리스트를 다룰 때 참조 그 자체를 nil로 바꾸면 본체에 영향이 안간다.
꼭 이전 노드값을 저장해서 next를 nil로 바꾸자.
'Algorithm' 카테고리의 다른 글
Container With Most Water - leetcode (0) | 2023.10.23 |
---|---|
Zigzag Conversion - leetcode (1) | 2023.10.20 |