leetcode第2题:两数相加

题目

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

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

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

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路

思路比较明确,因为是逆序的,我们只要从第一位一直加下去就可以。每次加一位注意结果有没有大于10,大于就在下一位的计算时结果值+1。

考虑最后可能会进一位的情况(即99+1=100),需要在最后判断进位是否为1,为1则再追加node。

代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode head = new ListNode(-1);
        ListNode cur = head;

        int carry = 0;

        // 循环,直到两个链表都到了末尾
        while (l1 != null || l2 != null) {
            // 如果为null,则赋值0
            // 因为有可能存在l1为空但l2不为空
            int d1 = l1 == null ? 0 : l1.val;
            int d2 = l2 == null ? 0 : l2.val;

            // 计算总和,如果总和大于10,将进位置为1
            int sum = d1 + d2 + carry;
            carry = sum >= 10 ? 1 : 0;

            // 将sum赋值给cur.next,并向前走一步
            cur.next = new ListNode(sum % 10);
            cur = cur.next;

            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }

            System.out.println(cur.toString());
        }
        // 如果两个循环结束了而进位为1,则增加一位
        if (carry > 0) {
            cur.next = new ListNode(1);
        }
        // 返回开始的节点
        return head.next;
    }

时间复杂度

我们这里只走一次循环,时间复杂度为 O(n)

leetcode最终执行时间为10ms,超过84.12%的人。

推荐阅读更多精彩内容