LeetCode02 - 两数相加(Java 实现)

LeetCode02 - 两数相加(Java 实现)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

题目描述

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

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

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

示例:

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

Java 实现与实现思路

/**
 * <p>
 * 02: 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
 * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 *
 * @author XiaoPengwei
 * @since 2019-07-14
 */
public class LeetCode02TwoAdd {

    public static void main(String[] args) {

        // 链表 1
        ListNode list1Node1 = new ListNode(2);
        ListNode list1Node2 = new ListNode(4);
        ListNode list1Node3 = new ListNode(3);
        list1Node1.next = list1Node2;
        list1Node2.next = list1Node3;

        // 链表 2
        ListNode list2Node1 = new ListNode(5);
        ListNode list2Node2 = new ListNode(6);
        ListNode list2Node3 = new ListNode(4);
        list2Node1.next = list2Node2;
        list2Node2.next = list2Node3;

        ListNode resListNode = addTwoNumbers(list1Node1, list2Node1);

        listNodePrint(resListNode);

    }

    /**
     * 注意逆序
     * 注意引用类型
     *
     * @param listNode1 链表 1
     * @param listNode2 链表 2
     * @return listNode
     */
    public static ListNode addTwoNumbers(ListNode listNode1, ListNode listNode2) {

        // 这里一方面是为了提高可读性,一方面是为了保留原来的 listNode1(引用类型,修改 p 也会修改 l1 的值)
        // 保留 listNode1 是为了最后的返回,因为 p 会走到 listNode1 最后的结点,要返回的是头结点
        ListNode p = listNode1;
        ListNode q = listNode2;

        // addNum 表示十位的数,即表示进位
        int addNum = 0;

        // 直到 q.next == null
        while (q != null) {

            // 因为链表长度不一定相等,如果有一个到头,另一个不到头,则将到头链表的空的位置补 0
            if (p.next == null && q.next != null) {
                p.next = new ListNode(0);
            }
            if (p.next != null && q.next == null) {
                q.next = new ListNode(0);
            }

            // 真正的和
            int sumAll = addNum + p.val + q.val;
            p.val = sumAll % 10;

            // 下一次进位
            addNum = sumAll / 10;

            // 如果两个链表都到头了,且还有未处理的进位,则将进位挂在后面(即最后一个,即最高位)
            if (p.next == null && q.next == null && addNum != 0) {
                p.next = new ListNode(addNum);
            }

            p = p.next;
            q = q.next;
        }
        return listNode1;
    }

    /**
     * 递归打印
     *
     * @param listNode 需打印的链表
     */
    public static void listNodePrint(ListNode listNode) {

        if (listNode == null) {
            return;
        }

        if (listNode.next == null) {
            System.out.println(listNode.val);
            return;
        }

        System.out.println(listNode.val);
        listNodePrint(listNode.next);
    }

}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}
posted @ 2019-07-14 19:36  xpwi  阅读(787)  评论(0编辑  收藏  举报