文章目录
1.题目描述
题目链接:https://leetcode.com/problems/add-two-numbers/
给定两个链表的头节点head1和head2,
认为从左到右是某个数字从低位到高位,返回相加之后的链表
例子
4 -> 3 -> 6
2 -> 5 -> 3
返回
6 -> 8 -> 9
解释
634 + 352 = 986
想到的一些特殊情况
特殊情况:
长:999
短:1
和:1000
长容纳不了进位信息时就要创建一个新节点
长:8899;
短:1
和:8900
同长同短:
长:111
短:222
这个情况主要是长短链表重定向那里会受影响,长和短的长度无法区分,所以以下方法不妥
ListNode L=length1>length2?head1:head2;
ListNode S=length1<length2?head1:head2;
2.题目分析
进位用求和后curNum%10
来分析,curNum/10
得到的数可以作为进位信息;
求和的值替换到长链表对应位置上。(curL.value+curS.value+carry)%10
基于情况的完全分类
长有,短有
长有,短无
长无,短无,有进位的时候就继续
注意,这样的分类不完备:两者都有,进位+长链表,长链表单独,这种分类会给后续coding的时候带来无尽痛苦
小工具函数,求出链表的节点数,后续可以用来区分长链表和短链表,其实之前写过类似的
其他注意:
carryTmp=(curL.value+curS.value+carry)/10;//用临时变量承接,避免覆盖
curL.value=(curL.value+curS.value+carry)%10;
carry=carryTmp;
以上不如使用这样的代码,后续长有短无的阶段,只需要修改第一行:去掉curS
curNum=curL.value+curS.value+carry;
curL.value=curNum%10;
carry=curNum/10;
3.核心代码
public static ListNode addTwoNumbers(ListNode head1, ListNode head2){
int length1=lengthOfListNode(head1);
int length2=lengthOfListNode(head2);
ListNode L=length1>length2?head1:head2;//重定向长短链表。
ListNode S=L==head1?head2:head1;
ListNode curL=L;//curL、curS用来定位,通过.next方法
ListNode curS=S;
ListNode last=curL;
int carry=0;
int carryTmp=0;
//接下来分三个阶段,长有短有,长有短无,长无短无
//进位carry=(L.value+S.value+carry)/10;carry只可能为0、1,极端情况,9+9+1=19,此时进位carry=1,余数可以作当前节点的值cur.value=(L.value+S.value+carry)%10。
//长有,短有
while(curS!=null){
curNum=curL.value+curS.value+carry;
curL.value=curNum%10;
carry=curNum/10;
last=curL;
curL=curL.next;
curS=curS.next;
}
//长有,短无
while(curL!=null){
curNum=curL.value+carry;
curL.value=curNum%10;
carry=curNum/10;
last=curL;
curL=curL.next;
}
//长无,短无,看进位
if(carry!=0){
last.next=new ListNode(1);
}
//最后返回
return L;
}
public int lengthOfListNode(ListNode head){
int count=0;
if(head==null){
return count;
}
while(head!=null){
head=head.next;
count++;
}
return count;
}
4.通过情况
时间上达到了最优,但是空间利用还需要加强,或许可以在变量的使用上做文章。
5.后续思考
新创建节点怎么处理?每创建一个节点都要重新命名吗?
这里的办法
把求和得到的值都加到长链表上curL.val = (curNum % 10);
这样有个缺点就是把长链表给覆盖了。解决的方法就是拷贝一份长链表
新创建节点的做法,给出了力扣的一些题解参考
if (head == null) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
作者:力扣官方题解
链接:https://leetcode.cn/problems/add-two-numbers/solutions/435246/liang-shu-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
p1.next = new ListNode();
p1 = p1.next;
p1.val = carry;
作者:喊666
链接:https://leetcode.cn/problems/add-two-numbers/solutions/2193990/ifyu-ju-you-dian-duo-dan-shi-hen-hao-li-p712o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。