美文网首页
leetcode第2题:两数相加

leetcode第2题:两数相加

作者: 春苟哈皮 | 来源:发表于2019-06-04 23:14 被阅读0次

    题目

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

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

    您可以假设除了数字 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%的人。

    相关文章

      网友评论

          本文标题:leetcode第2题:两数相加

          本文链接:https://www.haomeiwen.com/subject/upedxctx.html