Java数据结构与算法之-------如何计算两个单链表的所代表的数之和

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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值