Leetcode 445) Add Two Numbers II

image

내 풀이

/**
 * 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; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<Integer> r1=new Stack<>();
        Stack<Integer> r2 = new Stack<>();
        Stack<Integer> sum = new Stack<>();
        sum.push(0);

        ListNode tmp1=l1;
        ListNode tmp2=l2;
        while(tmp1!=null){
            r1.push(tmp1.val);
            tmp1= tmp1.next;   
        }
        while(tmp2!=null){
            r2.push(tmp2.val); 
            tmp2= tmp2.next;   
        }
        //아래 코드 보니까, 이 부분에서 굳이 &&을 안해도 됐었다. ||으로 해서 한번에 처리 가능
        while(!r1.empty() && !r2.empty()){
            int val=r1.pop()+r2.pop()+sum.pop();
            int up=0;
            if(val/10>0){
                up++;
            }
            sum.push(val%10);
            sum.push(up);
        }
        while(!r1.empty()){
            int val=sum.pop() + r1.pop();
            int up=0;
            if(val/10>0){
                up++;
            }
            sum.push(val%10);
            sum.push(up);
        }
        while(!r2.empty()){
            int val=sum.pop() + r2.pop();
            int up=0;
            if(val/10>0){
                up++;
            }
            sum.push(val%10);
            sum.push(up);
        }
        if(sum.peek()==0)sum.pop();
        ListNode res=new ListNode(sum.pop());
        ListNode tmp = res;
        while(!sum.empty()){
            tmp.next=new ListNode(sum.pop());
            tmp=tmp.next;
        }


        return res;
    }
}

다른 답안

  • 스택 사용해서
/**
 * 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; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<Integer> s1= new Stack<>();
        Stack<Integer> s2= new Stack<>();
        while(l1 !=null){
            s1.push(l1.val);
            l1=l1.next
        }
        while(l2 !=null){
            s2.push(l2.val);
            l2=l2.next
        }
        int carry=0;
        ListNode newHead=null;
        while(!s1.isEmpty() || s2.isEmpty() || carry !=0){
            //헐 대박 멋진 코드부분. empty 면 0을
            int n1= s1.isEmpty() ? 0 : s1.pop();
            int n2 = s2.isEmpty() ? 0 : s2.pop();
            int tmp = n1 +n2 + carry;
            ListNode newNode = new ListNode(tmp%10);
            newNode.next = newHead;
            newHead = newNode;
            carry=tmp/10;
        }
        return  newHead;
    }
}
  • 공간 더 사용하지 말라면, 아마 이렇게 reverse해서 계산하면 좋을 듯
/**
 * 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; }
 * }
 */
class Solution {
    public ListNode reverse(ListNode node) {
        ListNode pre = null;
        while(node != null) {
            ListNode next = node.next;
            node.next = pre;
            pre = node;
            node = next;
        }
        return pre;
    }

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        l1 = reverse(l1);
        l2 = reverse(l2);
        ListNode res = new ListNode(0);
        ListNode pre = res;
        int carry = 0;

        while(l1 != null || l2 != null) {
            int sum = carry;
            if(l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }

            if(l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }

            res.next = new ListNode(sum%10);
            res = res.next;
            carry = sum/10;

        }

        if(carry != 0) {
            res.next = new ListNode(carry);    
        }

        return reverse(pre.next);
    }
}

오답노트

  • tmpl1 을 res.next로 가리킨 다음에 다시 새로운 객체를 할당했으니까 res와 연결이 끊겼다
ListNode tmpl1=res.next;
//l1은 포인터로 안 가리켜도 된다. 사라져도 어차피 값을 저장한 후기때문에 상관없음
l1=l1.next;
i--;
while(i>j){
    tmpl1=new ListNode(l1.val);
    l1=l1.next;
    i--;
    tmpl1=tmpl1.next;
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2