LeetCode挑战热题 HOT 100-两数相加

LeetCode挑战热题 HOT 100


话不多说直接上题

1. 两数相加(链表题)

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。
示例 1:
在这里插入图片描述
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 算法编写语言

  • JAVA
  • 执行用时: 2 ms
  • 内存消耗: 38.6 MB
  • 题目难受:中等
  • 测试用例:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]

/**
 * 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) {
        ListNode listNodeNew = new ListNode(0,null);
        ListNode listNodeNewBody = listNodeNew;
        while(l1 != null || l2 != null){
            if(l1 != null && l2 != null){
                listNodeNewBody.val += l1.val + l2.val;
                l1 = l1.next;
                l2 = l2.next;
            }else if(l1 != null){
                listNodeNewBody.val += l1.val;
                l1 = l1.next;
            }else if(l2 != null){
                listNodeNewBody.val += l2.val;
                l2 = l2.next;
            }
            if(listNodeNewBody.val >= 10){
                listNodeNewBody.val = listNodeNewBody.val - 10;
                listNodeNewBody.next = new ListNode((listNodeNew.val/10) + 1,null);
            }else{
                if(l1 == null && l2 == null){
                    break;
                }else{
                    listNodeNewBody.next = new ListNode(0,null);
                }
            }
             listNodeNewBody = listNodeNewBody.next;
        }
        return listNodeNew;
    }
}

题目分析

这道题就是两个链表从左-》右顺序相加,逢10进1,补0,先拿两个长度相等的链表,从左(头位置)顺序开始,首先定义两个链表结构一个作为头节点,一个作为身体节点,开始初始化两个节点指向同一个新NEW出来的节点
在这里插入图片描述
这是l1,l2两个链表表示形式,注意:图可能我画的有头节点,但是这个问题里面是没有头节点的,l1.val就是2,l1.next等于4的那个节点
在这里插入图片描述
相同长度就开始分析链表中的值怎么取了,开始同时取第一个节点的值:就是

l1不为空,l2同时也不为空,
l1.val 2
l2.val 5
两个值相加:7
判断相加的值是否大于等于10:
	是:listNodeNewBody.val = listNodeNewBody.val - 10;
	listNodeNewBody.next = new ListNode(listNodeNewBody.val%10)+1,null)
	否:listNodeNewBody.next = new ListNode(0,null)
最后值7赋值给listNodeNewBody.val
l1 = l1.next,l2 = l2.next,l1,l2同时指向各自对应的第二个节点

在这里插入图片描述
判断l1或者l2链表的下一个节点是否为空,有一个不为空继续执行

l1.val 4
l2.val 6
两个值相加:10
判断相加的值是否大于等于10:
	是:listNodeNewBody.val = listNodeNewBody.val - 10;
	listNodeNewBody.next = new ListNode(listNodeNewBody.val%10)+1,null);
	否:listNodeNewBody.next = new ListNode(0,null);
最后listNodeNewBody.val - 10赋值给listNodeNewBody.val,
l1 = l1.next,l2 = l2.next,l1,l2同时指向各自对应的第三个节点

依次类推。最后的结果就是正确值。

总结

最后说一下节点可以叫做指针,叫法不一,但是功能都一样,对C语言、数据结构的了解的小伙伴应该都知道指针、链表,其实想学习算法的都可以去补习补习数据结构,里面有各种各样的思想算法和结构表达。上面的第三点步骤分析不是最终的结果,最终结果是上面的JAVA程序,步骤分析我认为就是一个公式,怎么解决的过程,当然还有各种各样的问题判断,比如两个链表长度不一的时候怎么运算都要适配,上面我只分析了长度一样的情况,当然也可能我讲的不太清楚,也可以留言问共同交流进步,同时我哪方面写的不对希望可以指出来,谢谢!
程序不是最终版,可以写成递归样式调用,代码会少很多,有兴趣的小伙伴可以自己去写一下试试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的肖傲楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值