两数相加
在学习Java过程中,在leetcode刷了一道关于链表两数相加的题目,对C语言中链表知识也是进行了一次回顾。现贴出代码如下:
首先是链表类,没什么好说的:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
代码有点长,执行时间还凑合,执行过程中主要产生的错误是node.next位置不对以至于产生空指针的情况:
public class Solution {
/*获取链表长度*/
public int getLength(ListNode node){
int nodeLength=0;
ListNode curNode=node;
while(curNode!=null){
nodeLength+=1;
curNode=curNode.next;
}
return nodeLength;
}
/*实现不同长度的链表相加*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int temp=0,addbit=0; //addbit为进位位
int lenght1=getLength(l1);
int lenght2=getLength(l2);
ListNode curL1=l1; //保存l1和l2的表头
ListNode curL2=l2;
if(lenght1>=lenght2){
/*计算到短链表的倒数第二位*/
while(curL2.next!=null){
temp=curL1.val+curL2.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL1.val=temp;
curL1=curL1.next;
curL2=curL2.next;
}
/*计算到短链表的最后一位*/
temp=curL1.val+curL2.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL1.val=temp;
/*依次将长链表与进位位相加,注意curL1=curL1.next循环最前面*/
while(curL1.next!=null){
curL1=curL1.next;
temp=curL1.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL1.val=temp;
}
/*若长链表最高位进位*/
if(addbit>0){
ListNode newNode=new ListNode(addbit);
curL1.next=newNode;
}
return l1;
}
else{
while(curL1.next!=null){
temp=curL1.val+curL2.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL2.val=temp;
curL2=curL2.next;
curL1=curL1.next;
}
temp=curL1.val+curL2.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL2.val=temp;
while(curL2.next!=null){
curL2=curL2.next;
temp=curL2.val+addbit;
if(temp>9){
temp-=10;
addbit=1;
}
else addbit=0;
curL2.val=temp;
}
if(addbit>0){
ListNode newNode=new ListNode(addbit);
curL2.next=newNode;
}
return l2;
}
}
}