본문 바로가기

Algorithm

Add Two Numbers - leetcode

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