LeetCode第二题

创建账号后写了一篇mysql的简单配置之后,就一直没有再开过坑,我不太喜欢写东西。但是我决定改变,多写博客,

多写知识才能进一步锻炼自己的水准。所以我打算之后坚持写博客。

思路:就是因为链表非空,所以不用判断链表是否为空。那么我只需要考虑两个链表的长短即可,所以分三种情况,不断更新即可。


/**
 * LeetCode第二题
 * 两数相加
 * @author 29819
 *
 */
public class Solution {
	/*
	给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的
	每个节点只存储单个数字。将两数相加返回一个新的链表。
	
	你可以假设除了数字 0 之外,这两个数字都不会以零开头。
	
	示例:
	
	输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
	输出:7 -> 0 -> 8
	原因:342 + 465 = 807
	*/
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		/*
		 * 这个所谓的逆序存储让我想起来我们加减法也是从个位开始运算的
		 * ,所以我的想法就是:我不开辟额外的存储空间,使用原来的链表
		 * 谁长结果放在谁那边
		 */
		 int length1 = 0;
		 int length2 = 0;
		 /*
		  * 因为是非空链表,我就不再做非空检测了
		  */
		 /*
		  * 得到链表1的长度
		  */
		 ListNode temp1 = l1;
		 while(temp1 != null){
			 temp1 = temp1.next;
			 length1++;
		 }
		 /*
		  * 得到链表2的长度
		  */
		 ListNode temp2 = l2;
		 while(temp2 != null){
			 temp2 = temp2.next;
			 length2++;
		 }
		 if(length1<length2){
			 /*
			  * 说明链表2比较长,那么返回修改后的链表2
			  */
			 ListNode t1 = l1;
			 ListNode t2 = l2;
			 ListNode last = l2;
			 boolean isJinwei = false;//是否进位,初始无进位
			 while(t2 != null){ //链表2较长,按链表2进行循环
				 if(t1 != null){
					 t2.val += t1.val;//两个链表的节点相加
				 }
				 if(isJinwei){
					 t2.val += 1;//进位只可能为1
				 }
				 if(t2.val>=10){//产生进位,下一位加1
					 /*
					  * 先更新当前节点的值
					  */
					 t2.val %= 10;
					 isJinwei = true;
				 }else{
					 isJinwei = false;
				 }
				 if(t1 != null){
					 t1 = t1.next;
				 }
				 if(t2.next == null){
					 /*
					  * 记录下链表2的尾节点
					  */
					 last = t2;
				 }
				 t2 = t2.next;
			 }
			 /*
			  * 只要判断最后一个节点是否有进位就行了
			  */
			 if(isJinwei){
				 last.next = new ListNode(1);//最后只会进位1
			 }
			 return l2;
		}else if(length1>length2){
			/*
			 * 说明链表1比较长,那么返回修改后的链表1
			 */
			ListNode t1 = l1;
			ListNode t2 = l2;
			ListNode last = l1;
			boolean isJinwei = false;//是否进位,初始无进位
			while(t1 != null){
				if(t2 != null){
					t1.val += t2.val;
				}
				if(isJinwei){
					t1.val += 1;
				}
				if(t1.val>=10){
					t1.val %= 10;//更新t1.val
					isJinwei =true;
				}else{
					isJinwei =false;
				}
				if(t1.next == null){
					last = t1;//记录下链表1的尾节点
				}
				t1 = t1.next;
				if(t2 != null){
					t2 = t2.next;
				}
			}
			if(isJinwei){
				last.next = new ListNode(1);
			}
			return l1;
		}else{
			/*
			 * 两个链表长度相同
			 */
			ListNode t1 = l1;
			ListNode t2 = l2;
			ListNode last = l1;
			boolean isJinwei = false;
			while(t1 != null){
				t1.val += t2.val;
				if(isJinwei){
					t1.val += 1;
				}
				if(t1.val>=10){
					t1.val %= 10;
					isJinwei = true;
				}else{
					isJinwei = false;
				}
				if(t1.next == null){
					last = t1;
				}
				t1 = t1.next;
				t2 = t2.next;
			}
			if(isJinwei){
				last.next = new ListNode(1);
			}
			return l1;
		}
	}
}
class ListNode {
	int val;
	ListNode next;
	ListNode(int x) { val = x; 
	}
}

我的文笔蛮差的,可能没有说清楚,但是我的代码中有相关的内容,然后这道题需要注意的是代码需要考虑到很多种情况,必须考虑链表的结束节点和两个链表的长短,节点值超出十更新节点值并且还要向下一位进位。

以后我会不断地锻炼自己的文笔,嗯,加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值