leetcode-2.两数相加

115 阅读2分钟
/**
 * ref:https://leetcode-cn.com/problems/add-two-numbers/
 * 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
 * 请你将两个数相加,并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 示例:
 * 输入:l1 = [2,4,3], l2 = [5,6,4]
 * 输出:[7,0,8]
 * 解释:342 + 465 = 807
 **/
public class AddTwoNumbers {

    public static void main(String[] args){
        // 构造node1
        ListNode node13 = new ListNode(3,null);
        ListNode node12 = new ListNode(4,node13);
        ListNode node1 = new ListNode(2,node12);
        // 构造node2
        ListNode node23 = new ListNode(4,null);
        ListNode node22 = new ListNode(6,node23);
        ListNode node2 = new ListNode(5,node22);
        // 输出
        System.out.println("node1:"+node1);
        System.out.println("node2:"+node2);
        System.out.println("sumNode:"+addTwoNumbers(node1,node2));
    }

    /**
     * 从前向后迭代两个链表的数据,直到都为空时,结束。
     * 迭代时候,对两个链表元素求和,并加上上次进位值,如果值大于9,则需要记录新的进位值。
     * 最后将结果对10取模赋值给新的链表,迭代一轮,链表移位一次,新链表的next位置记录一次值。
     * @param node1
     * @param node2
     * @return
     */
    public static ListNode addTwoNumbers(ListNode node1, ListNode node2){
        ListNode sumNode = new ListNode(0);
        // 用于记录进位值,默认无进位值为0
        int sumNext = 0;
        ListNode current = sumNode;
        while(node1!=null||node2!=null){
            // 计算两个元素的和
            int sum = sumNext + (node1==null?0:node1.val) + (node1==null?0:node2.val);
            // 计算进位值,如果值大于9,则除以10进行进位
            sumNext  = sum/10;
            // 指针继续移动
            if(node1!=null){
                node1 = node1.next;
            }
            if(node2!=null){
                node2 = node2.next;
            }
            // 计算结果的指针移动
            sumNode.next = new ListNode(sum%10,null);
            sumNode = sumNode.next;
        }
        // 如果最后链表的数字加完还有进位的话,那么还需要额外再创建出一个节点
        if (sumNext > 0) {
            current.next = new ListNode(sumNext);
        }
        // 跳过初始化时使用的首节点0
        return current.next;
    }

}