문제 - 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;
}
}