2.两数相加

  题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 

  如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

  您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

  示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

  思路:同时遍历两个链表,将对应节点的值相加,并记录进位值,如果循环到有一个链表的节点为null时,就用0和另一个链表节点的值相加,直到两个链表的节点都为null。时间复杂度O(m+n),空间复杂度O(1)。

  需要注意的是,当循环退出时,还要判断一次进位值是否为1,如果为1要再向上进一位。

class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            //定义一个前节点,每次循环将当前节点变为前节点
            ListNode previousNode = new ListNode(0);
            //将初始化的前节点赋值给一个头节点,用于保存最前面的节点
            ListNode head = previousNode;
            //十进制
            int ary = 10;
            //初始化进位值为0
            int carry = 0;
            while (l1 != null || l2 != null) {
                //判断l1、l2是否为null,为null就假定当前的val值为0
                int x = l1 == null ? 0 : l1.val;
                int y = l2 == null ? 0 : l2.val;
                //计算当前位的值
                int value = (x + y + carry) % ary;
                //计算进位值
                carry = (x + y + carry)/ary;
                //新建当前节点并赋值给前节点的next
                previousNode.next = new ListNode(value);
                //将前节点赋值为当前节点,方便进行下次循环
                previousNode = previousNode.next;
                //如果l1、l2不为null,遍历到下一个节点
                l1 = l1 == null ? null : l1.next;
                l2 = l2 == null ? null : l2.next;
            }
            //注意最后l1、l2都为null时,while循环退出,但如果前一次有进位的情况
            if (carry == 1) {
                previousNode.next = new ListNode(1);
            }
            //返回头节点的第二个节点,保存个位数值的节点
            return head.next;
        }
    }
原文地址:https://www.cnblogs.com/advancedcz/p/14073798.html