两数相加(题号2)

题目

理解

    两条链表都是逆序存储,所以直接从左向右依次相加

    可以利用下面的加法算式来帮助理解,通常习惯是从最右边开始算起,也就是个位、十位、百位这样的顺序。题目是逆序存储,左边第一个是个位,左边第二个是十位,向下以此类推,所以要从左边开始算起。

    因为要返回新链表,所以先创建一个傀儡节点,来帮助创建新链表,再创建一个当前节点cur来在新链表上移动,最后,返回傀儡节点的下一个节点即可。

    需要注意的是,如果是图片右侧这种情况,即使链表最后没有节点,但最后两位相加大于十,也要记得为这个进位增加一个节点。

图解

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode newListNode = new ListNode(-1);
        ListNode cur = newListNode;
        int i = 0;
        while(l1 != null || l2 != null){
            int val1 = l1 == null ? 0 : l1.val;
            int val2 = l2 == null ? 0 : l2.val;
            int sum = i > 0 ? (val1 + val2 + 1) : (val1 + val2);
            i = sum >=10 ? 1: 0;
            ListNode n = new ListNode(sum%10);
            cur.next = n;
            cur = cur.next;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        if(i > 0){
            //创建val=1的节点,因为进位最多进一位(9+9=18 < 20),
            cur.next = new ListNode(1);
        }
        return newListNode.next;
    }
}

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

空间复杂度:O(1)。

看到此处即是情,别忘记点个赞哦。如果有其他问题,欢迎评论,共同探讨!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值