Loading

力扣 - 2. 两数相加

题目

2. 两数相加

思路

  • 这个和445. 两数相加 II很像,而且比 445 的简单一点
  • 如何控制位数不一样情况下计算?如果短的先到末尾了,但是长的那个还没到,那么我们可以先用0来代替短的那个值,结果是不影响的
  • 当两个链表都到达末尾时候,但是carry,即进位是1,那么还需要再计算一次,将进位加上
  • 只有三者都不满足条件,才算计算完,跳出循环

代码

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode();
        ListNode p = head;
        int carry = 0;
        int num1 = 0;
        int num2 = 0;

        // 只要两个链表有一个不为空或者carry为1,链表就还要再进行计算
        while (l1 != null || l2 != null || carry != 0) {
            // 如果链表到达末尾了就用0代替
            if (l1 != null) {
                num1 = l1.val;
                l1 = l1.next;
            } else {
                num1 = 0;
            }
            if (l2 != null) {
                num2 = l2.val;
                l2 = l2.next;
            } else {
                num2 = 0;
            }
            int total = num1 + num2 + carry;
            // 计算进位
            carry = total / 10;
            // 求余
            total %= 10;
            ListNode n = new ListNode(total);
            p.next = n;
            p = p.next;
        }
        return head.next;
    }
}

复杂度分析

  • 时间复杂度:\((N)\),其中 N 为 l1 / l2 中较长的那个链表的长度
  • 空间复杂度:\(O(N)\),其中 N 为新链表的长度
posted @ 2020-11-08 17:34  linzeliang  阅读(82)  评论(0)    收藏  举报