1. 问题描述
给定两个链表,链表的每个节点代表一个数,计算两个数的和。例如:输入链表(3--1--5 )和链表(5--9--2)。输出8--0--8,就513+295=808,注意个位数的在链表头。
2 思路分析
· 对链表中的节点直接进行相加操作,把相加的和存储到新的链表中对应的节点中,同事还要记录节点相加以后产生的进位。
注意:1)每组节点相加后需要记录其是否存在进位。
2)如果两个链表的长度不同,当短链表计算完后,只需要考虑长链表的节点值(还有存在的进位)。
3)所有的链表计算完成后,还要考虑是否有进位。
3.代码实现
package linkedlist.linkedSum;
public class TwoLinkedSum {
public static void main(String[] args) {
int i=1;
LNode head1=new LNode();
head1.next=null;
LNode head2=new LNode();
head2.next=null;
LNode temp=null;
LNode cur=head1;
LNode addresult=null;
//构造第一个链表
for (;i<7;i++){
temp=new LNode();
temp.date=i+2;
temp.next=null;
cur.next=temp;
cur=temp;
}
cur=head2;
//构造第二个链表
for (i=9;i>4;i--){
temp=new LNode();
temp.date=i;
temp.next=null;
cur.next=temp;
cur=temp;
}
System.out.print("head1:");
for (cur=head1.next;cur!=null;cur=cur.next){
System.out.print(cur.date+" ");
}
System.out.print("\n head2:");
for (cur=head2.next;cur!=null;cur=cur.next){
System.out.print(cur.date+" ");
}
System.out.println("相加后:");
LNode resulthead = add(head1, head2);
for (cur=resulthead.next;cur!=null;cur=cur.next){
System.out.print(cur.date+" ");
}
}
/**
* 对两个带头结点的单链表相加
* @param h1 h1 链表的头结点
* @param h2
* @return 返回相加后链表的头结点
*/
public static LNode add(LNode h1,LNode h2){
if (h1==null||h1.next==null){
return h2;
}
if (h2==null||h2.next==null){
return h1;
}
int c=0;//用来记录进位数
int sum=0;//用来记录两个节点相加的值
LNode p1=h1.next;//用来遍历h1
LNode p2=h2.next;//用来遍历h2
LNode temp=null;//用来遍历指向新创建的储存想加和的节点
LNode resulthead=new LNode();//相加后新链表的头结点
resulthead.next=null;//现在新链表只有一个头结点
LNode p=resulthead;//p指向新链表的最后一个节点。因为现在链表只有一个头结点,因此指向resulthead
while (p1!=null&&p2!=null){
temp=new LNode();//辅助指针
temp.next=null;
sum=p1.date+p2.date+c;
temp.date=sum%10;
c=sum/10;
p.next=temp;
p=temp;//后移
p1=p1.next;
p2=p2.next;
}
//链表h2比链表h1长,接下来只要考虑h2
if (p1==null){
while (p2!=null){
temp=new LNode();//辅助
temp.next=null;
sum=p2.date+c;
temp.date=sum%10;
c=sum/10;
p.next=temp;
p=temp;
p2=p2.next;
}
}
//链表h1比链表h2长,接下来只要考虑h1
if (p2==null){
while (p1!=null){
temp=new LNode();//辅助
temp.next=null;
sum=p1.date+c;
temp.date=sum%10;
c=sum/10;
p.next=temp;
p=temp;
p1=p1.next;
}
}
//如果计算完之后还有进位
if (c==1){
temp=new LNode();
temp.next=null;
temp.date=1;
p.next=temp;
}
return resulthead;
}
}
class LNode{
LNode next;
int date;
}