Leetcode#2:两数相加[medium]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42191317/article/details/102772706

描述

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

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

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

示例

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路

1>暴力解法

从头到尾相加即可,设置标志位来代表是否进1。

时间复杂度O(M+N),空间复杂度O(1)

注意事项:

注意一些边界条件,如加上进的一位刚好是10,如两个链表长度相等,下一次都为空,但存在进位等情况。

代码

package cn.lzx.linkedlist;

/**
 *@ClassNameLeetcode2_addTwoNumbers
 *@Description
 *@Author lzx
 *@Date2019/10/27 22:52
 *@Version V1.0
 **/
public class Leetcode2_addTwoNumbers {


    public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
        }
    }


    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        ListNode res = new ListNode(0);
        ListNode first = res;
        //记录是否进位
        boolean flag = false;
        while(l1 != null && l2 != null){
            if(l1.val + l2.val + (flag ? 1 : 0) > 9){
                res.next = new ListNode((l1.val + l2.val + (flag ? 1 : 0)) % 10);
                flag = true;
            }else{
                res.next = new ListNode(l1.val + l2.val + (flag ? 1 : 0));
                flag = false;
            }
            res = res.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        //处理最后一次进位
        while(flag){
            if(l1 != null){
                //是否会再次进位
                if(l1.val + 1 > 9){
                    res.next = new ListNode((l1.val + 1)%10);
                }else{
                    flag = false;
                    res.next = new ListNode(l1.val + 1);
                }
                l1 = l1.next;
            }else if(l2 != null){
                if(l2.val + 1 > 9){
                    res.next = new ListNode((l2.val + 1)%10);
                }else{
                    flag = false;
                    res.next = new ListNode(l2.val + 1);
                }
                l2 = l2.next;
            }else{
                res.next = new ListNode(1);
                flag = false;
            }
            res = res.next;
        }
        while(l1 != null){
            res.next = new ListNode(l1.val);
            res = res.next;
            l1 = l1.next;
        }
        while(l2 != null){
            res.next = new ListNode(l2.val);
            res = res.next;
            l2 = l2.next;
        }
        return first.next;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_42191317/article/details/102772706