2014年8月2日星期六

Adding two numbers

LeetCode solution. For this problem, the major issue for most people would be forgetting to handle the last carry on value.

Here I provide two solutions. First one is a recursive version, the second one is iterative version.

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       
        if(l1 == null) return l1;
        if(l2 == null) return l2;
       
        return addTwoNumbers(l1,l2,0);
    }
   
    public ListNode addTwoNumbers(ListNode l1, ListNode l2, int carryOn){
   
       
        if(l1 == null&&l2!=null){
            ListNode l3 = new ListNode((carryOn+l2.val)%10);
            l3.next = addTwoNumbers(l1, l2.next,(carryOn+l2.val)/10);
            return l3;
        }else if(l1!=null &&l2==null){
            ListNode l3 = new ListNode((carryOn+l1.val)%10);
            l3.next = addTwoNumbers(l1.next, l2,(carryOn+l1.val)/10);
            return l3;
        }else if(l1 !=null && l2!=null){
            ListNode l3 = new ListNode((carryOn+l1.val+l2.val)%10);
            l3.next = addTwoNumbers(l1.next, l2.next,(carryOn+l1.val+l2.val)/10);
            return l3;
        }else{
            if(carryOn == 0) return null;
            ListNode l3 = new ListNode(carryOn);
            return l3;
        }
    }


###the iterative version

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carryOn =0;
        ListNode result=null;
        ListNode curNode=null;
       
        if(l1 == null) return l2;
        if(l2 == null) return l1;
        ListNode l1Head = l1;
        ListNode l2Head = l2;
        while(l1Head!=null && l2Head!=null){
            ListNode newNode = new ListNode((l1Head.val+l2Head.val+carryOn)%10);
            carryOn = ((l1Head.val+l2Head.val+carryOn))/10;
            if(result ==null){
                result =newNode;
                curNode=newNode;
            }else{
                curNode.next=newNode;
                curNode = newNode;
            }
            l1Head = l1Head.next;
            l2Head = l2Head.next;
        }
       
        while(l2Head !=null){
            ListNode newNode = new ListNode((carryOn+l2Head.val)%10);
            carryOn=(carryOn+l2Head.val)/10;
            curNode.next=newNode;
            curNode =newNode;
            l2Head=l2Head.next;
        }
       
        while(l1Head !=null){
            ListNode newNode = new ListNode((carryOn+l1Head.val)%10);
            carryOn=(carryOn+l1Head.val)/10;
            curNode.next=newNode;
            curNode =newNode;
            l1Head = l1Head.next;
        }
       
        if(carryOn!=0){
            ListNode newNode = new ListNode(carryOn);
            curNode.next=newNode;
        }
        return result;
    }

The second code is a little bit longer. Happy to discuss!