LeetCode:2. 两数相加;445. 两数相加 II

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 :


输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

这个题目,主要难点在于进位不要忘,注意边界。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        int chu = (l1.val+l2.val)/10;  //记录每次相加后的进位数
        ListNode curr = new ListNode((l1.val+l2.val)%10,null); //当前节点

        ListNode root = curr;//根节点
        //同时满足三个条件,循环才会结束
        while (l1.next!=null || l2.next!=null || chu!=0){ 

            //如果节点已经是空,循环未结束,则val设为0;
            int l1Val = 0;
            if(l1.next != null){
                l1Val = l1.next.val;
                //不为空则继续下一次
                l1 = l1.next;
            }

            int l2Val = 0;
            if(l2.next != null){
                l2Val = l2.next.val;
                //不为空则继续下一次
                l2 = l2.next;
            }

            //计算三者的和
            int he = l1Val + l2Val + chu;
            //重置进位数
            chu = he/10;
            //建立节点
            ListNode listNode = new ListNode(he%10,null);
            //指向建立的节点
            curr.next = listNode;

            //下一个循环
            curr = listNode;
            
        }

        return root;
    }
}

时间复杂度:O(n),空间复杂度:O(1)

 

再继续看升级版:445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

因为只能从低位开始计算,因此需要用先进后出的容器,所以,栈。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Deque<Integer> deque1 = new LinkedList<>();
        Deque<Integer> deque2 = new LinkedList<>();
        //压栈
        while (l1 != null){
            deque1.push(l1.val);
            l1 = l1.next;
        }
        //压栈
        while (l2 != null){
            deque2.push(l2.val);
            l2 = l2.next;
        }

        int chu = 0;
        ListNode root = null;

        while (!deque1.isEmpty() || !deque2.isEmpty() || chu>0){
            //
            int d1Val = deque1.isEmpty()?0:deque1.pop();
            int d2Val = deque2.isEmpty()?0:deque2.pop();

            ListNode listNode = new ListNode((chu+d1Val+d2Val)%10);

            chu = (chu+d1Val+d2Val)/10;

            listNode.next = root;

            root = listNode;
        }
        return root;
    }
}

时间复杂度:O(max(m,n))。

空间复杂度:O(m+n)

 

 

posted @ 2021-04-29 19:02  蜗壳吃虾米  阅读(49)  评论(0)    收藏  举报