leetcode练习 add two numbers

原题

  You are given two linked listsrepresenting two non-negative numbers. The digits are stored in reverse orderand each of their nodes contain a single digit. Add the two numbers and returnit as a linked list.

  Input: (2 -> 4 -> 3) + (5 -> 6-> 4)

  Output: 7 -> 0 -> 8

题目大意

有两个单链表,代表两个非负数,每一个节点代表一个数位,数字是反向存储的,即第一个结点表示最低位,最后一个结点表示最高位。求两个数的相加和,并且以链表形式返回。

单链表头文件

#pragma once

typedef struct linknode

{

public:

       intdata;

       linknode*next;

}LinkNode;

class singleLink

{

private:

       LinkNode*head;

public:

       singleLink(void);

       ~singleLink(void);

       boolclearSingleLink();

       boolisEmpty(){return head==NULL;};

       intgetSingleLinkLength();

       boolgetSingleLinkItem(int i,int *e);

       intlocateSingleLinkItem(int e);

       boolpreSingleLinkItem(int cur_e,int *pre_e);

       boolnextSingleLinkItem(int cur_e,int *next_e);

       boolInsertSingleLinkItem(int i,int e);

       booldeleteSingleLinkItem(int i,int *e);

       LinkNode*Reverse();   //反转函数

};

单链表实现文件

#include "StdAfx.h"

#include "singleLink.h"

 

singleLink::singleLink(void)

{

       head=NULL;

}

 

singleLink::~singleLink(void)

{

       LinkNode*p=head;

       while(head)

       {

              p=head;

              head=head->next;

              delete(p);

       }

}

bool singleLink::clearSingleLink()

{

       booltmp=false;

       LinkNode*p=head;

       while(head)

       {

              p=head;

              head=head->next;

              delete(p);

       }

       tmp=true;

       returntmp;

}

int singleLink::getSingleLinkLength()

{

       intlen=0;

       LinkNode*p=head;

       while(p!=NULL)

       {

              len++;

              p=p->next;

       }

       returnlen;

}

bool singleLink::getSingleLinkItem(inti,int *e)

{

       LinkNode*p=head;

       intj=0;

       while(p&&j<i)

       {

              p=p->next;

              j++;

       }

       if(p==NULL)

       {

              returnfalse;

       }

       *e=p->data;

       returntrue;

}

int singleLink::locateSingleLinkItem(int e)

{

       inti=0;

       LinkNode*p=head;

       while(p!=NULL)

       {

              if(p->data==e)

              {

                     returni;

              }

              else

                     p=p->next;

              i++;

       }

       return-1;

}

bool singleLink::preSingleLinkItem(intcur_e, int *pre_e)

{

       LinkNode*p=head;

       if(p->data==cur_e)

              returnfalse;

       while(p->next!=NULL)

       {

              if(p->next->data==cur_e)

              {

                     *pre_e=p->data;

                     returntrue;

              }

              else

                     p=p->next;

       }

       returnfalse;

}

bool singleLink::nextSingleLinkItem(intcur_e, int *next_e)

{

       LinkNode*p=head;

       if(head==NULL||head->next==NULL)

       {

              returnfalse;

       }

       while(p->next!=NULL)

       {

              if(p->data==cur_e)

              {

                     *next_e=p->next->data;

                     returntrue;

              }

              else

                     p=p->next;

       }

       returnfalse;

}

bool singleLink::InsertSingleLinkItem(inti, int e)

{

       LinkNode*p=head,*s;

       intj=0;

       if(i==0)

       {

              s=(LinkNode*)new LinkNode[1];

              s->data=e;

              s->next=p;

              head=s;

              returntrue;

       }

       while(p&&j<i-1)

       {

              p=p->next;

              j++;

       }

       if(p==NULL)

       {

              returnfalse;

       }

       s=(LinkNode*)new LinkNode[1];

       s->data=e;

       s->next=p->next;

       p->next=s;

       returntrue;

}

bool singleLink::deleteSingleLinkItem(inti, int *e)

{

       LinkNode*p=head,*s;

       if(p==NULL)

       {

              returnfalse;

       }

       intj=0;

       if(i==0)

       {

              head=head->next;

              *e=p->data;

              delete(p);

              p=NULL;

              returntrue;

       }

       while(p&&j<i-1)

       {

              j++;

              p=p->next;

       }

       if(p==NULL)

       {

              returnfalse;

       }

       s=p->next;

       p->next=p->next->next;

       *e=s->data;

       delete(s);

       s=NULL;

       returntrue;

}

LinkNode* singleLink::Reverse()

{

       if(head==NULL||head->next==NULL)

       {

              returnhead;

       }

       LinkNode*p=head,*q=head->next,*r;

       head->next=NULL;

       while(q)

       {

              r=q->next;

              q->next=p;

              p=q;

              q=r;

       }

       head=p;

       returnhead;

}

题目实现

#include "stdafx.h"

#include "cctype"

#include "iostream"

#include<math.h>

#include <ctime>

#include "afxtempl.h"

#include "singleLink.h"

using namespace std;

#define random(a,b) (rand()%(b-a+1)+a)

#define MAX_INDEX    20 //定义数组个数

 

int _tmain(int argc, _TCHAR* argv[])

{

       srand((unsigned)time(NULL));

 

       intfirstBit=0;   //第一个数的位数

       intsecondBit=0;    //第二个数的位数

       //随机产生两个3-8之间的数作为两个数的位数

       firstBit=random(3,8);

       secondBit=random(3,8);

       cout<<"firstbit   "<<firstBit<<endl;

       cout<<"secondBit   "<<secondBit<<endl;

       singleLinkfirst;     //第一个数

       singleLinksecond;    //第二个数

       inttmp;

       //产生第一个数

       for(int i=0;i<firstBit;i++)

       {

              if(i==firstBit-1)

              {

                     tmp=random(1,9);

                     first.InsertSingleLinkItem(firstBit-1,tmp);

              }

              else

              {

                     tmp=random(0,9);

                     first.InsertSingleLinkItem(i,tmp);

              }     

       }

       //产生第二个数

       for(int i=0;i<secondBit;i++)

       {

              if(i==secondBit-1)

              {

                     tmp=random(1,9);

                     second.InsertSingleLinkItem(secondBit-1,tmp);

              }

              else

              {

                     tmp=random(0,9);

                     second.InsertSingleLinkItem(i,tmp);

              }     

       }

       inta=0;

       int*p=&a;

       //逆序输出第一个数

       cout<<"第一个数(逆序):";

       for(int i=0;i<first.getSingleLinkLength();i++)

       {

              if(first.getSingleLinkItem(i,p))

              {

                     cout<<*p<<"  ";

              }

       }

       cout<<endl<<"第二个数(逆序):";

       //逆序输出第二个数

       for(int i=0;i<second.getSingleLinkLength();i++)

       {

              if(second.getSingleLinkItem(i,p))

              {

                     cout<<*p<<"  ";

              }

       }

       singleLinkresult;

       intcount=0;

       //位数多的当做循环计数

       if(firstBit>=secondBit)

       {

              count=firstBit;

       }

       else

              count=secondBit;

       intbase=0;    //本位

       intcarry=0;    //进位

       intaa=0;

       intbb=0;

       int*pf=&aa;

       int*ps=&bb;

       for(int i=0;i<count;i++)

       {

              if((first.getSingleLinkItem(i,pf))&&(second.getSingleLinkItem(i,ps)))

              {

                     base=(*pf+*ps+carry)%10;

                     carry=(*pf+*ps+carry)/10;

                     result.InsertSingleLinkItem(i,base);

                     if((i==count-1)&&(carry>0))

                     {

                            result.InsertSingleLinkItem(i+1,carry);

                     }

              }

              elseif ((!first.getSingleLinkItem(i,pf))&&(second.getSingleLinkItem(i,ps)))

              {

                     base=(*ps+carry)%10;

                     carry=(*ps+carry)/10;

                     result.InsertSingleLinkItem(i,base);

                     if((i==count-1)&&(carry>0))

                     {

                            result.InsertSingleLinkItem(i+1,carry);

                     }

              }

              elseif ((first.getSingleLinkItem(i,pf))&&(!second.getSingleLinkItem(i,ps)))

              {

                     base=(*pf+carry)%10;

                     carry=(*pf+carry)/10;

                     result.InsertSingleLinkItem(i,base);

                     if((i==count-1)&&(carry>0))

                     {

                            result.InsertSingleLinkItem(i+1,carry);

                     }

              }

              else

              {

                     ;

              }

 

       }

       cout<<endl<<"结果(逆序):";

       for(int i=0;i<result.getSingleLinkLength();i++)

       {

              if(result.getSingleLinkItem(i,p))

              {

                     cout<<*p<<"  ";

              }

       }

       LinkNode*oresult=result.Reverse();   //结果换成正常顺序

      

       //打印结果

       cout<<endl<<"最后结果:";

       while(oresult)

       {

              cout<<oresult->data<<"";

              oresult=oresult->next;

       }

 

       system("PAUSE");

              return0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值