2. 两数相加

迭代

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyHead = new ListNode(-1);
        ListNode head = dummyHead;
        ListNode cur1 = l1;
        ListNode cur2 = l2;

        int n;
        int sum;
        int rest = 0;

        /**
         * 只要有一个链表没有遍历完就继续循环
         * 分三种情况计算数字的和
         */
        while (cur1 != null || cur2 != null){
            
            if (cur1 != null && cur2 != null){

                sum = cur1.val + cur2.val + rest;
                cur1 = cur1.next;
                cur2 = cur2.next;
            }
            else if (cur1 == null && cur2 != null){

                sum = cur2.val + rest;
                cur2 = cur2.next;
            }
            else {

                sum = cur1.val + rest;
                cur1 = cur1.next;
            }

            if (sum < 10){

                n = sum;
                rest = 0;
            }
            else if (sum == 10){

                n = 0;
                rest = 1;
            }
            else {

                rest = sum / 10;
                n = sum % 10;
            }

            /**
             * 把数字和存储在新链表的新节点中
             */
            head.next = new ListNode(n);
            head = head.next;
        }

        /**
         * 最后一位数字可能会发生进位,因此要单独判断一下
         */
        if (rest == 1){
            head.next = new ListNode(rest);
        }

        return dummyHead.next;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——简化求和判断过程

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        ListNode dummyHead = new ListNode(-1);
        ListNode head = dummyHead;
        ListNode cur1 = l1;
        ListNode cur2 = l2;

        int n;
        int sum;
        int rest = 0;

        /**
         * 只要有一个链表没有遍历完就继续循环
         * 分三种情况计算数字的和
         * 最后一位数字可能会发生进位的情况合并进循环
         */
        while (cur1 != null || cur2 != null || rest != 0){

            /**
             * 简化求和
             * 如果节点不存在就默认为0
             */
            sum = (cur1 == null ? 0 : cur1.val) + (cur2 == null ? 0 : cur2.val) + rest;

            /**
             * 简化加法进位
             */
            n = sum % 10;
            rest = sum / 10;

            /**
             * 把数字和存储在新链表的新节点中
             */
            head.next = new ListNode(n);
            head = head.next;

            if (cur1 != null){
                cur1 = cur1.next;
            }

            if (cur2 != null){
                cur2 = cur2.next;
            }
        }

        return dummyHead.next;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/add-two-numbers/submissions/

posted @ 2021-12-09 22:10  振袖秋枫问红叶  阅读(15)  评论(0)    收藏  举报