第二题相对于第一题较简单,主要考察的链表的操作,两个链表的相加操作。
#include<iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
ListNode *addTwoNumbers(ListNode *l1,ListNode *l2)
{
ListNode *tail=new ListNode(0);
int carry=0;
ListNode *ptr=tail;
while((l1!=NULL)||(l2!=NULL))
{
int val1=0;
int val2=0;
if(l1!=NULL)
{
val1=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
val2=l2->val;
l2=l2->next;
}
int tmp=val1+val2+carry;
ptr->next=new ListNode(tmp%10);
carry=tmp/10;
ptr=ptr->next;
}
if(carry==1)
ptr->next=new ListNode(1);
return tail->next;
}
int main()
{
int count_l1;
cout<<"请输入第一个链表的长度:";
while(scanf("%d",&count_l1)!=EOF)
{
cout<<"请输入第一个链表:\n";
int m,i;
ListNode *l1=new ListNode(0);
ListNode *p1=l1;
for(i=0;i<count_l1;i++)
{
scanf("%d",&m);
ListNode *tmp=new ListNode(m);
p1->next=tmp;
p1=p1->next;
}
cout<<"请输入第二个链表的长度:";
int count_l2;
scanf("%d",&count_l2);
cout<<"请输入第二个链表:\n";
ListNode *l2=new ListNode(0);
ListNode *p2=l2;
for(i=0;i<count_l2;i++)
{
scanf("%d",&m);
ListNode *tmp=new ListNode(m);
p2->next=tmp;
p2=p2->next;
}
ListNode *p=addTwoNumbers(l1->next,l2->next);
cout<<"相加之后的结果是:";
while(p!=NULL)
{
cout<<p->val;
cout<<" ";
p=p->next;
}
cout<<endl;
cout<<"请输入第一个链表的长度:";
}
return 0;
}
carry用于表示进位,从第一位开始让两个链表的数相加,加到没有数为止,如果最后carry等于1,则说明还有一个进位,再添加一个val为1的节点即可。