你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲(chǔ)按照在原來整數(shù)中相反的順序,使得第一個(gè)數(shù)字位于鏈表的開頭。寫出一個(gè)函數(shù)將兩個(gè)整數(shù)相加,用鏈表形式返回和。
樣例
給出兩個(gè)鏈表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null
相加,并記錄進(jìn)位情況
這個(gè)沒有什么難的,從頭開始是個(gè)位,然后十位,百位……以此類推,要用一個(gè)變量來記錄進(jìn)位情況,這種相加進(jìn)位最多進(jìn)1,然后就是,當(dāng)一個(gè)鏈表加到頭就停止(注意處理進(jìn)位),然后再處理沒有加完的那個(gè)鏈表,處理完之后然后再看有沒有進(jìn)位,有的話放在鏈表最后,鏈表也寫了很久了,這種操作一定要熟練:
雖然很長(zhǎng),但是基本的處理套路都在第一個(gè)循環(huán)里了,看看就可以了。
ListNode * addLists(ListNode * l1, ListNode * l2) {
// write your code here
ListNode *head=new ListNode(0); //存放結(jié)果
ListNode *first;
first=head; //假的表頭,主要是把這個(gè)地址存起來,這個(gè)不動(dòng)
if(l1==NULL) return l2;
if(l2==NULL) return l1;
int res=0;
int jinwei=0;
while(l1!=NULL&&l2!=NULL)
{
res=l1->val+l2->val+jinwei; //當(dāng)前位求和
if(res>9) //如果有進(jìn)位,算出來。
{
res%=10; //取余數(shù)
jinwei=1; //進(jìn)位是1
}
else
jinwei=0; //進(jìn)位置零
ListNode *temp=new ListNode(res); //生成一個(gè)新節(jié)點(diǎn)
head->next=temp; //連接到head上
head=head->next; //head向后移動(dòng)
l1=l1->next; //兩個(gè)鏈表向后移動(dòng)
l2=l2->next;
}
while(l1!=NULL) //如果l1比較長(zhǎng)
{
res=l1->val+jinwei;
if(res>9) //處理最后還有進(jìn)位的情況
{
res%=10;
jinwei=1;
}
else
jinwei=0;
ListNode *temp=new ListNode(res);
head->next=temp; //連接到head上
head=head->next; //head向后移動(dòng)
l1=l1->next; //兩個(gè)鏈表向后移動(dòng)
}
while(l2!=NULL) //如果l2比較長(zhǎng)
{
res=l2->val+jinwei;
if(res>9)
{
res%=10;
jinwei=1;
}
else
jinwei=0;
ListNode *temp=new ListNode(res);
head->next=temp; //連接到head上
head=head->next; //head向后移動(dòng)
l2=l2->next; //兩個(gè)鏈表向后移動(dòng)
}
cout<<jinwei<<endl;
if(jinwei==1) //最后還有進(jìn)位的話
{
ListNode *temp=new ListNode(jinwei);
jinwei=0;
head->next=temp; //連接到head上
head=head->next; //head向后移動(dòng)
}
return first->next;
}