leetcode开篇~

问题描述:

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

 

首先要看懂题目,囧。第一次看,着实没有看懂。。

翻译一下:用两个链表表示两个非负整数。链表每个节点表示一个数字,按照数字倒序排列。比如123,用链表表示是3->2->1。求两个数字相加的和,并用链表表示。如342+465=807,用链表表示为7->0->8.

解答:

第一次写完使用的是递归的方式,结果显示超时。如下:

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return addTwoNumbers(l1, l2, false);
    }

    private static ListNode addTwoNumbers(ListNode l1, ListNode l2, boolean putMore){
        if(l1 == null && l2 == null){
            return putMore ? new ListNode(1) : null;
        }else if(l1 == null){
            return putMore ? addTwoNumbers(l2, new ListNode(1), false) : l2;
        }else if(l2 == null){
            return putMore ? addTwoNumbers(l1, new ListNode(1), false) : l1;
        }

        int value = putMore ? (l1.val+l2.val+1) : (l1.val+l2.val);
        putMore = value >= 10 ? true : false;
        ListNode result = new ListNode(value%10);
        result.next = addTwoNumbers(l1.next, l2.next, putMore);
        return result;
    }

 然后查看了其他人的解答,改为非递归方式:

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);
        ListNode node = head;
        ListNode p1 = l1;
        ListNode p2 = l2;
        boolean putMore = false;
        while (p1 != null || p2 != null || putMore){
            int add1 = p1 == null ? 0 : p1.val;
            int add2 = p2 == null ? 0 : p2.val;
            int value = putMore ? (add1+add2+1) : (add1+add2);
            putMore = value >= 10 ? true : false;
            node.next = new ListNode(value%10);
            if(p1 != null) p1 = p1.next;
            if(p2 != null) p2 = p2.next;
            node = node.next;
        }
        return head.next;
    }

  

 

加上测试代码:

    private static ListNode initListNode(List<Integer> valueList){
        ListNode result = new ListNode(valueList.get(0));
        ListNode node = result;
        for(int i=1; i<valueList.size(); i++){
            node.next = new ListNode(valueList.get(i));
            node = node.next;
        }
        return result;
    }

    private static List<Integer> getResult(ListNode node){
        List<Integer> result = Lists.newArrayList();
        ListNode temp = node;
        while (temp != null){
            result.add(temp.val);
            temp = temp.next;
        }
        return result;
    }

    public static void main(String[] args) {
        ListNode l1 = initListNode(Lists.newArrayList(6));
        System.out.println("l1:" + JSON.toJSONString(getResult(l1)));
        ListNode l2 = initListNode(Lists.newArrayList(6,9));
        System.out.println("l2:" + JSON.toJSONString(getResult(l2)));
        ListNode node = addTwoNumbers(l1, l2);
        System.out.println("result:" + JSON.toJSONString(getResult(node)));
    }

  

总结:

递归方式解答问题,比较容易想到。有了递归解答,要试着改成非递归的形式,提高性能。

posted on 2016-12-21 20:18  漫夭  阅读(259)  评论(2编辑  收藏  举报