Leetcode:addTwoNumbers,思路分析、代码、通过情况

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.通过情况

leetCode的通过情况
时间上达到了最优,但是空间利用还需要加强,或许可以在变量的使用上做文章。

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值