创建账号后写了一篇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;
}
}
我的文笔蛮差的,可能没有说清楚,但是我的代码中有相关的内容,然后这道题需要注意的是代码需要考虑到很多种情况,必须考虑链表的结束节点和两个链表的长短,节点值超出十更新节点值并且还要向下一位进位。
以后我会不断地锻炼自己的文笔,嗯,加油。