美文网首页
微习惯养成第三天——求两个链表的和

微习惯养成第三天——求两个链表的和

作者: 天天one | 来源:发表于2017-07-14 17:19 被阅读7次

    求两个链表的和

    • 题目:
      你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。

    • 样例:
      给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null。

    我的答案:

    public class LinkListSum {
    
        /**
         * @param l1: the first list
         * @param l2: the second list
         * @return: the sum list of l1 and l2
         */
        public LinkListNode addLists(LinkListNode l1, LinkListNode l2) {
            // write your code here
            return sum(l1, l2, 0);
        }
    
        private LinkListNode sum(LinkListNode l1, LinkListNode l2, int factor) {
            LinkListNode result = new LinkListNode(0);
            if (l1 != null && l2 != null) {
                int sum = l1.val + l2.val + factor;
                result.val = sum % 10;
                factor = sum / 10;
                result.next = sum(l1.next, l2.next, factor);
            } else {
                if (l1 != null) {
                    l1.val = l1.val + factor;
                    result = l1;
                    factor = 0;
                    result.next = sum(l1.next, null, factor);
                } else if (l2 != null) {
                    l2.val = l2.val + factor;
                    result = l2;
                    factor = 0;
                    result.next = sum(null, l2.next, factor);
                } else {//跳出条件
                    if (factor != 0) {
                        result.val = factor;
                    } else {
                        result = null;
                    }
                }
            }
            return result;
        }
    
        /**
         * @param intArray
         * @param i        from 0 to length
         * @return
         */
        public LinkListNode creatListNode(int[] intArray, int i) {
            if (i == intArray.length) {
                return null;
            }
            LinkListNode result = new LinkListNode(intArray[i]);
            i++;
            result.next = creatListNode(intArray, i);
            return result;
        }
    }
    

    测试:

    /**
     * 3->1->2->null
     5->9->5->1->null
     */
    LinkListSum linkListSum = new LinkListSum();
    int[] intArray1 = {3, 1, 2};
    int[] intArray2 = {5, 9, 5, 1};
    LinkListNode linkListNode1 = linkListSum.creatListNode(intArray1, 0);
    LinkListNode linkListNode2 = linkListSum.creatListNode(intArray2, 0);
    LinkListNode result = linkListSum.addLists(linkListNode1, linkListNode2);
    System.out.println(" result :" + result);
    

    输出结果:

     3  1  2 null
     5  9  5  1 null
     result : 8  0  8  1 null
    

    注意事项:

    1. 首先是递归思想,跳出条件;
    2. 注意两个链表长度不同时候;
    3. 注意相加大于10时候的进位,并且在长度不同的时候进位在使用完要清0;

    代码实现仅供参看,大家有好的思路可以讨论。

    相关文章

      网友评论

          本文标题:微习惯养成第三天——求两个链表的和

          本文链接:https://www.haomeiwen.com/subject/xlrohxtx.html