码迷,mamicode.com
首页 > 其他好文 > 详细

求两个用链表表示的整数的和

时间:2015-08-18 22:46:33      阅读:573      评论:0      收藏:0      [点我收藏+]

标签:

技术分享给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。


技术分享进阶

      假设这些数位是正向存放的。

技术分享技术分享

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry)
{
/*两个链表全部都为空且进位为0,则函数返回*/
if (l1 == null &&l2 == null&&carry == 0)
{
return null;
}
LinkedListNode result = new LinkedListNode();
/*将value以及l1和l2的data相加*/
int value = carry;
if (l1 != null)
{
value += l1.data;
}
if (l2 != null)
{
value += l2.data;
}
result.data = value % 10;/*求和结果的个数*/
/*递归*/
LinkedListNode more = addLists(l1==null?null:l1.next,l2==null?null:l2.next,value>=10?1:0);
result.setNext(more);
return result;
}

      在实现这段代码时,务必注意处理一个链表比另一个链表结点少的情况。不然可能会出现指针异常。

技术分享进阶

技术分享

public class PartialSum
{
public LinkedListNode sum=null;
public int carry=0;
}
    LinkedListNode addLists(LinkedListNode l1,LinkedListNode l2)
    {
    int len1=length(l1);
    int len2=length(l2);
    //用零填充较短的链表
    if(len1<len2)
    {
    l1=padList(l1,len2-len1);
    }
    else
    {
    l2=padList(l2,len1-len2);
    }
    //对两个链表求和
    PartialSum sum=addListsHelper(l1,l2);
    //如有进位,则插入链表首部,否则,直接返回整个链表
    if(sum.carry==0)
    {
    return sum.sum;
    }
    else
    {
    LinkedListNode result=insertBefore(sum.sum,sum.carry);
    return result;
    }
    }
    PartialSum addListsHelper(LinkedListNode l1,LinkedListNode l2)
    {
        if(l1==null && l2==null)
        {
        PartialSum sum=new PartialSum();
        return sum;
        }
        //对较小数字递归求和
        PartialSum sum=addListHelper(l1.next,l2.next);
        //将进位和当前数据相加
        int val=sum.carry +l1.data+l2.data;
        //插入当前数字的求和结果
        LinkedListNode full_result=insertBefore(sum.sum,val%10);
        //返回求和结果和进位值
        sum.sum=full_result;
        sum.carry=val/10;
        return sum;
    }
    //用零填充链表
    LinkedListNode padList(LinkedListNode l,int padding)
    {
    LinkedListNode head=l;
    for(int i=0;i<padding;i++)
    {
    LinkedListNode n=new LinkedListNode(0,null,null);
    head.prev=n;
    n.next=head;
    head=n;
    }
    return head;
    }
   
     //辅助函数,将结点插入链表首部
    LinkedListNode insertBefore(LinkedListNode list,int data)
    {
    LinkedListNode node=new LinkedListNode(data,null,null);
    if(list!=null)
    {
    list.prev=node;
    node.next=list;
    }
    return node;
    }


版权声明:本文为博主原创文章,未经博主允许不得转载。

求两个用链表表示的整数的和

标签:

原文地址:http://blog.csdn.net/wangfengfan1/article/details/47754721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!