Lc2-俩数相加

/**
 * 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
 * 
 * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 * 
 * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 
 * 示例:
 * 
 * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
 * 
 * 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 *
 */
public class Lc2 {
    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    /**
     * 借助预先指针使得遇到无指针可用时可以用预先指针
     *
     * 此外声明俩个指针pre 与 curr,pre表示头指针,通过curr记录当前节点的值,通过pre串成链
     * 
     * 本题的思路:利用链表的每一个节点记录当前节点的值,当遍历完最长的所有节点后确定是否有进位,有则再创将一个节点加入。
     * 
     * 为什么不用数组,因为不好确定数组的长度,动态创建会增加额外空间开销
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode curr = pre;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + carry;
            carry = sum / 10;
            sum = sum % 10;
            curr.next = new ListNode(sum);
            curr = curr.next;
            l1 = l1 == null ? l1 : l1.next;
            l2 = l2 == null ? l2 : l2.next;
        }
        if (carry == 1) {
            curr.next = new ListNode(carry);
        }
        return pre.next;
    }

    /*
     * 数组转化成链表的小工具
     */
    public static ListNode convertArrayToListNode(int[] array) {
        ListNode root = new ListNode(array[0]);// ·生成链表的根节点,并将数组的第一个元素的值赋给链表的根节点
        ListNode other = root;// ·生成另一个节点,并让other指向root节点,other在此作为一个临时变量,相当于指针
        for (int i = 1; i < array.length; i++) {// ·由于已给root赋值,所以i从1开始
            ListNode temp = new ListNode(array[i]);// ·每循环一次生成一个新的节点,并给当前节点赋值
            other.next = temp;// ·将other的下一个节点指向生成的新的节点
            other = temp;// ·将other指向最后一个节点(other的下一个节点) other=other.getNext();

        }
        return root;
    }

    public static void main(String[] args) {
        int[] l1 = { 2, 4, 5 };
        int[] l2 = { 5, 6, 4 };
        ListNode node1 = convertArrayToListNode(l1);
        ListNode node2 = convertArrayToListNode(l2);
        ListNode res = addTwoNumbers(node1, node2);
        System.out.println();

    }
}
posted @ 2020-01-02 13:17  小傻孩丶儿  阅读(167)  评论(0编辑  收藏  举报