算法_链表_两数相加

jasmine 于 2019-06-02 发布
/**
 * 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
 * 请你将两个数相加,并以相同形式返回一个表示和的链表。
 * 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 输入:l1 = [2,4,3], l2 = [5,6,4]
 * 输出:[7,0,8]
 * 解释:342 + 465 = 807.
 * 示例 2:
 * 输入:l1 = [0], l2 = [0]
 * 输出:[0]
 * 示例 3:
 * 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
 * 输出:[8,9,9,9,0,0,0,1]
 * 提示:
 * 每个链表中的节点数在范围 [1, 100] 内
 * 0 <= Node.val <= 9
 * 题目数据保证列表表示的数字不含前导零
 */
public class 两数相加 {
    public static Node.IntNode addTwoNumbers(Node.IntNode list1, Node.IntNode list2) {
        Node.IntNode resNode = new Node.IntNode(-1);

        Node.IntNode tempNode1 = list1;
        Node.IntNode tempNode2 = list2;

        boolean needAdd = false;

        while (tempNode1 != null || tempNode2 != null || needAdd) {

            //为节点付默认值
            int v1 = tempNode1 == null ? 0 : tempNode1.val;
            int v2 = tempNode2 == null ? 0 : tempNode2.val;

            //计算合并后节点值
            int v3 = v1 + v2;
            if (needAdd) {
                v3 = v1 + v2 + 1;
            }

            //判断下一个节点是否加1
            if (v3 >= 10) {
                v3 = v3 % 10;
                needAdd = true;
            } else {
                needAdd = false;
            }

            //将新节点追加到resNode最后面
            Node.IntNode resTempNode = resNode;
            while (resTempNode.next != null) {
                resTempNode = resTempNode.next;
            }
            resTempNode.next = new Node.IntNode(v3);

            //指针到下一个节点
            if (tempNode1 != null) {
                tempNode1 = tempNode1.next;
            }
            if (tempNode2 != null) {
                tempNode2 = tempNode2.next;
            }
        }
        return resNode.next;
    }

    public static void main(String[] args) {
        Node.IntNode resNodes = addTwoNumbers(Node.getSameNode(4, 3), Node.getSameNode(1, 6));

        Node.IntNode tempNode = resNodes;
        while (tempNode != null) {
            System.out.println("遍历 n = " + tempNode.val);
            tempNode = tempNode.next;
        }
    }
}