前言
前段时间陆陆续续刷了一波leetcode题,发现挺有意思,用来打发时间还是挺不错的,这里记录一下已经做过的部分题目,参考了网上的一些解题过程和解决思路,方便回看
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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
题目数据保证列表表示的数字不含前导零
代码思路分析
这个题tm的看了好几遍了,当时每次都没完全看明白,今天一看原来着么简单,这里分析一下逻辑,这里整数相加有进位一说,进位值无非就两个,要么是0,要么是1,刚开始肯定是0,先设置一个进位值carry为0,然后这里要设置两个节点去处理,一个是头节点,一个是尾节点,,一开始两个节点都为空
两者刚开始肯定都是空,然后判断两个节点是否有一个不为空,如果不为空,那么进入进一步判断,设置两个int变量,如果任意一个链表不为空,则把当前节点的值赋值给int变量,否则设置为0,
然后设置sum值为当前两个节点的值与节点值的和,一开始判断头节点是否为空,这种情况相当于第一次进入循环,此时两个节点的值赋值为sum%10,每次sum的取余就是当前位置要赋值的部分,比如4和7,那么当前位置就是1,如果头结点不为空,说明开始进入第二次循环,此时只有tail节点进入活跃状态,需要tail指针不断右移,那么需要使用下面两行代码
tail.next=new ListNode(sum%10)
tail=tail.next;
这是相当于尾指针不断右移,
在while循环外边设置进位值为0,然后此时,设置进位值为 sum/10,不断更新
然后判断两个链表是否为空了,如果不为空,继续右移,,当整个循环结束后,判断此时的进位值是否为1,如果是1,那么需要进位 ,此时tail为最后一个节点,此时将进位值作为tail的下一个节点即可,最后返回head即可
代码实现
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head=null,tail=null;
int carry=0;
while(l1!=null || l2!=null){
int n1=l1!=null?l1.val:0;
int n2=l2!=null?l2.val:0;
int sum=n1+n2+carry;
if(head==null){
head=tail=new ListNode(sum%10);
}else{
tail.next=new ListNode(sum%10);
tail=tail.next;
}
carry=sum/10;
if(l1!=null){
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
if(carry>0){
tail.next=new ListNode(carry);
}
return head;
}
注意事项
1,通过%10用来获取当前位置要展示的值
2,通过/10 来获取进位值
3,这里注意最后一次进位值是否为1来决定是否做特殊处理
实现效率
9:42 info
解答成功:
执行耗时:1 ms,击败了100.00% 的Java用户
内存消耗:41.3 MB,击败了10.54% 的Java用户