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程序,步骤分析我认为就是一个公式,怎么解决的过程,当然还有各种各样的问题判断,比如两个链表长度不一的时候怎么运算都要适配,上面我只分析了长度一样的情况,当然也可能我讲的不太清楚,也可以留言问共同交流进步,同时我哪方面写的不对希望可以指出来,谢谢!
程序不是最终版,可以写成递归样式调用,代码会少很多,有兴趣的小伙伴可以自己去写一下试试