[leetcode 2] Add Two Numbers

심지훈·2021년 6월 28일
0

leetcode

목록 보기
20/21

문제링크

나의 논리

두 리스트의 원소들을 더하는 문제이다. 일단 연결 리스트의 값에 접근 해야되기 때문에 두 리스트를 순회해야한다고 생각했다.
리스트 순회는 head에서 시작하여 다음 노드 nextNone일때까지 순회하면 된다.

문제에서 l1,l2 리스트의 길이가 다를 수 있기 때문에
두 리스트가 완전히 None이 될때까지 순회하여야 하는 대신에
다음 노드가 있는 경우에만 리스트 = 리스트.다음노드를 이용해 리스트를 이동하고 node 또한 이동한다. 그리고 일반적으로 덧셈을 하는것과 마찬가지로 자리 올림이 발생하면 overflow 변수에 저장해놓고 높은 자릿수에 더해준 후 overflow 변수를 0으로 둔다.
모든 리스트 순회를 마치고나서도 자리 올림이 발생했다면 마지막 노드에서 올림수 1을 이용해서 노드를 하나 더 만들고 마지막노드에 연결한다. 그리고 head를 반환한다.

파이썬

def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        
        head = ListNode()
        node = head
        
        overflow = 0
        while l1 or l2:
            
            node.val = overflow
            overflow = 0
            
            node.val += l1.val if l1  else 0
            node.val += l2.val if l2  else 0
            
            if node.val >= 10:
                overflow = 1
                node.val %= 10
            
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
            
            if l1 or l2:
                node.next = ListNode()
                node = node.next
                
        if overflow:
            node.next = ListNode(overflow)
            
        return head

자바스크립트

var addTwoNumbers = function(l1, l2) {
    
    let overflow = 0;
    const head = new ListNode();
    let node = head;
    
    while(l1 || l2){
        
        node.val = overflow;
        overflow = 0;
        
        node.val += (l1 === null ? 0 : l1.val);
        node.val += (l2 === null ? 0 : l2.val);
        
        if(node.val >= 10){
            overflow = 1;
            node.val %= 10;
        }
        
        if(l1){
            l1 = l1.next;
        }
        
        if(l2){
            l2 = l2.next;
        }
        
        if(l1 || l2){
            node.next = new ListNode();
            node = node.next;
        }
        
    }
    
    if(overflow){
        node.next = new ListNode(overflow);
    }
    
    return head;
    
};
profile
유연한 개발자

0개의 댓글