LeetCode-2. 兩數相加(連結串列+大數加法模擬)
2. 兩數相加
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
#include<bits/stdc++.h>
using namespace std;
//Definition for singly-linked list.
struct ListNode
{
int val;
struct ListNode *next;
};
/********************提交程式碼********************/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
int i,j=0,ca=0,cb=0,cnt=0;
int *a=(int*)malloc(10000*sizeof(int));
int *b=(int*)malloc(10000*sizeof(int));
int *c=(int*)malloc(10000*sizeof(int));
int *res=(int*)malloc(10000*sizeof(int));
struct ListNode *ans;
struct ListNode *p=l1;
struct ListNode *q=l2;
while(p)//將連結串列中的數存入陣列
{
a[ca++]=p->val;
p=p->next;
}
while(q)
{
b[cb++]=q->val;
q=q->next;
}
bool flag=false;
if(ca>cb)//第一個串比第二個串位數多
{
for(i=0; i<cb; ++i)//處理前面相同位數下的相加
{
int res=a[i]+b[i];
if(flag)//有進位要加
{
++res;
flag=false;
}
if(res>=10)//需要進位
{
flag=true;
c[cnt++]=res%10;
}
else
c[cnt++]=res%10;
}
j=cnt;
for(i=cb; i<ca; ++i)//處理多餘位數
c[cnt++]=a[i];
while(flag)//處理相同位數下的進位
{
if(j==ca-1)
{
++c[j];
break;
}
++c[j];
flag=false;
if(c[j]>=10)
{
c[j]%=10;
flag=true;
++j;
}
}
}
else if(ca<cb)//第一個串比第二個串位數少
{
for(i=0; i<ca; ++i)
{
int res=a[i]+b[i];
if(flag)
{
++res;
flag=false;
}
if(res>=10)
{
flag=true;
c[cnt++]=res%10;
}
else
c[cnt++]=res%10;
}
j=cnt;
for(i=ca; i<cb; ++i)
c[cnt++]=b[i];
while(flag)
{
if(j==cb-1)
{
++c[j];
break;
}
++c[j];
flag=false;
if(c[j]>=10)
{
c[j]%=10;
flag=true;
++j;
}
}
}
else//相等位數
{
for(i=0; i<ca; ++i)
{
int res=a[i]+b[i];
if(flag)
{
++res;
flag=false;
}
if(res>=10)
{
flag=true;
c[cnt++]=res%10;
}
else
c[cnt++]=res%10;
}
if(flag)//處理最後一位的進位
{
c[cnt++]=1;
flag=false;
}
}
j=0;
for(i=0; i<cnt; ++i)
{
if(c[i]>=10)//處理二位數
{
res[j++]=c[i]%10;
res[j++]=c[i]/10;
}
else
res[j++]=c[i];
}
struct ListNode *s,*r;
ans=(struct ListNode *)malloc(sizeof(struct ListNode));
ans->val=res[0];
ans->next=NULL;
r=ans;
for(i=1; i<j; ++i)//尾插
{
s=(struct ListNode *)malloc(sizeof(struct ListNode));
s->val=res[i];
r->next=s;
r=s;
}
r->next=NULL;
return ans;
}
/***************************************************/
void Create(ListNode *&h,int a[],int n)//建立一個不帶頭節點的單連結串列
{
int i;
ListNode *s,*r;
h=(ListNode *)malloc(sizeof(ListNode));
h->val=a[0];
h->next=NULL;
r=h;
for(i=1; i<n; ++i)
{
s=(ListNode *)malloc(sizeof(ListNode));
s->val=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("F:/cb/read.txt","r",stdin);
//freopen("F:/cb/out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int m,n;
while(cin>>m>>n)
{
struct ListNode *ans;
ListNode *l1,*l2;
int a[100],b[100];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0; i<m; ++i)
cin>>a[i];
Create(l1,a,m);//尾插法將a陣列中的值插入連結串列
for(int i=0; i<n; ++i)
cin>>b[i];
Create(l2,b,n);
ans=addTwoNumbers(l1,l2);
struct ListNode *p=ans;
while(p)
{
cout<<p->val;
p=p->next;
}
cout<<endl;
}
return 0;
}
資料位數會比較長,所以不能先相加再存入新連結串列。
所以這其實就是兩個大數相加的模擬題啦。
手生的很(;д;),這種函式連結串列也忘了(;′⌒`),我賊菜哇QAQ。
我是分成兩個數位數長度的三種情況來討論的,相同位上的數依次相加考慮進位就OK了。
測試用例:
2 2
9 9
9 9
2 2
3 7
9 2
3 3
2 4 3
5 6 4
1 3
1
9 9 9
3 1
8 9 9
2
3 1
9 9 9
1
1 3
0
2 7 8
1 2
1
9 9
2 1
9 8
1
2 1
1 8
0
1 2
0
1 8
3 3
2 4 3
5 6 4
相關文章
- 演算法用連結串列模擬大整數加法運算演算法
- 神奇補0解決連結串列相加:LeeCode002兩數相加
- 演算法5: LeetCode_單連結串列_兩數相加演算法LeetCode
- 陣列模擬單連結串列陣列
- 面相物件(三):模擬連結串列物件
- 2. 兩數相加
- hduoj1002 A + B Problem II (大數相加 字串模擬)字串
- LeetCode——兩數相加LeetCode
- Leetcode兩數相加LeetCode
- 演算法-兩數相加演算法
- 模擬STL連結串列類的實現
- 程式設計題-兩數相加程式設計
- LeetCode 2——兩數相加LeetCode
- 【leetcode】【2、兩數相加】LeetCode
- 【LeetCode】2 兩數相加LeetCode
- LeetCode-兩數相加LeetCode
- 大數加法(處理不了負數)
- 環形連結串列_相交連結串列_多數元素(java語言)Java
- (陣列)大數相乘,相加陣列
- LeetCode 2.兩數相加LeetCode
- leetcode 2. 兩數相加LeetCode
- JavaScript兩數相加(踩坑)記錄JavaScript
- 陣列模擬單連結串列你會了嗎?陣列
- day4 連結串列-模擬與快慢指標指標
- pta重排連結串列(一個很清晰的實現,完全模擬連結串列的實現)
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- LeetCode 第二題兩數相加LeetCode
- 力扣題解2-兩數相加力扣
- LeetCode題集-2 - 兩數相加LeetCode
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- Day 4 | 24. 兩兩交換連結串列中的節點 、 19.刪除連結串列的倒數第N個節點 、面試題 02.07. 連結串列相交 、142.環形連結串列II面試題
- 大數運算—大數加法、減法、乘法、除法詳解
- 用陣列實現大數加法陣列
- 用連結串列的方式實現大數相減-Java實現Java
- ZOJ Martian Addition (20進位制的兩個大數相加)