[leetcode] Add Two Numbers Java

Bong2·2024년 6월 16일
0

알고리즘

목록 보기
34/63

문제 - Add Two Numbers

문제 설명

문제 접근

처음 시도할때에는 링크된 노드에 대한 합산을 String을 통해 숫자를 하나씩 뽑은 다음에 더한 후 해당 값을 이용하여 String으로 변환 후 길이 만큼 ListNode를 만들어서 결과를 출력하려고 했다. 하지만 Long은 64비트여서 제한된 숫자를 표현할 수 있기 때문에 RunTime오류가 났다..

그래서 각 처음의 값을 더한 다음에 carry가 있다면 해당 carry을 이용하여 계속 값을 더해주는 식으로 했다. 해당 내용은 옛날에 컴퓨터에서 더하기를 구할때 사용되는 방법인거 같다.

실패한 코드

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 import java.util.*;
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        
        String s1 = doMakeListReverse(l1);
        String s2 = doMakeListReverse(l2);

        Long sum = Long.parseLong(s1) + Long.parseLong(s2);
        
        String []answer = String.valueOf(sum).split("");
        
        ListNode pre = null;
        for(int i=0;i < answer.length;i++)
        {
            ListNode node;
            int value = Integer.parseInt(answer[i]);
            node = new ListNode(value,pre);
            pre = node;
        }

        return pre;
    }

    String doMakeListReverse(ListNode n)
    {
        ListNode node = n;
        StringBuilder sb= new StringBuilder();
        while(true)
        {
            sb.append(node.val);
            if(node.next == null)
            {
                break;
            }
            
            node = node.next;
        }

        return sb.reverse().toString();
    }
}

성공한 코드

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
import java.util.*;
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        
        ListNode ans = new ListNode(0);
        ListNode p = l1, q = l2, cur = ans;
        int carry = 0;

        while(p != null || q != null)
        {
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = carry + x + y;
            carry = sum/10;
            cur.next = new ListNode(sum%10);
            cur = cur.next;
            if(p != null ) p = p.next;
            if(q != null ) q = q.next;

        }

        if(carry > 0)
        {
            cur.next = new ListNode(carry);
        }

        return ans.next;
    }
}

profile
자바 백엔드 개발자로 성장하자

0개의 댓글