题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解法
1.我的解法(仅供参考)
时间复杂度O(max(m,n))
假设m和n分别为l1和l2的长度,最多重复max(m,n)次
空间复杂度O(max(m,n))
新列表的长度最多为max(m,n)+1
1 | public static ListNode addTwoNumbers(ListNode l1, ListNode l2) { |
这个算法在我本机上测试能够成功测试提交的测试数据,但是在官网提交时会提示超出时间限制。
主要缺陷:
判断不太行,中间经常会因为
1 | cur.next = new ListNode(0); |
这段代码之前没有加上充分的判断导致结果最后莫名其妙多出一个0,必须经常调试然后加l1/l2.next的判断,导致最后越绕越晕。
所以我的代码仅供参考,更多的是想分享一下我踩的坑和我这个菜逼从一开始读题目都懵逼到可以繁琐的写出算法的思路。
我的测试数据
1 | public class ListNode { |
1 |
|
2.官方解法
时间复杂度O(max(m,n))
假设m和n分别为l1和l2的长度,最多重复max(m,n)次
空间复杂度O(max(m,n))
新列表的长度最多为max(m,n)+1
这里直接引用leetcode官方讲解
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | public ListNode addTwoNumbers(ListNode l1, ListNode l2) { |
精辟之处:
对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
活用(判断条件)?x1:x2 真的可以简化好多代码
3.天皇解法:
学自评论区的mata川这位用户,有实力就是可以装bei:
维护一个进位变量t,还有比👴更短的吗??
开始你的简化秀
1 | class Solution { |
天皇记录:
执行用时 :2 ms, 在所有 Java 提交中击败了99.93% 的用户
内存消耗 :39.9 MB, 在所有 Java 提交中击败了94.26%的用户
结语
最近木鱼的请回答1988系列完结了,相当于重新温故了一下1988,这部剧真的每年都值得回看一遍。
人人都不愿做狗焕,人人都是狗焕😔
94年的狗焕车里的磁带是88年德善喜欢的李文世 可是94年的阿泽房里的磁带是94年的德善喜欢的李承焕 而狗焕对德善的爱一直停留在了88年。