LeetCode2.两数相加

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

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

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

 

题目精巧的设置成逆序存储的链表,正好对应加法中的从个位数开始相加的顺序,需要注意的是,在相加的过程中,不仅要记录当前位两个数字是否有进位,还需要记录上一次两数相加的进位情况。

 

对于长度不想等的两个链表,当为null时,将null补0来方便计算。

 

最后判断相加后,如果进位仍为1,就将进位插入到链表中,使用哑节点来进行返回。

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null && l2 == null) {
            return null;
        }
        //定义哑节点
        ListNode dummyNode = new ListNode(-1);
        //定义前驱节点遍历链表
        ListNode prevNode = dummyNode;
        //定义进位标志 1 -> 有进位 0 -> 无进位
        int addOne = 0;

        while (l1 != null || l2 != null) {
            //为短链表进行补0操作
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;

            //每一次遍历都要 加上 之前是否有进位
            int sum = x + y + addOne;

            //每一次遍历都记录是否有进位
            addOne = sum / 10;

            //将实际数值放入链表
            //7 + 8 = 15 进位为 1 实际值为 5
            sum = sum % 10;
            prevNode.next = new ListNode(sum);

            //要进行补0操作,防止nullPointer
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
            prevNode = prevNode.next;
        }
        //如果遍历完毕后,addOne进位还为1,加入到链表
        if (addOne == 1) {
            prevNode.next = new ListNode(addOne);
        }
        return dummyNode.next;
    }

 

posted @ 2020-09-30 09:18  硬盘红了  阅读(106)  评论(0编辑  收藏  举报