链表实现两个字符串的加法(反转链表)
来源:互联网 发布:网络进度计划软件 编辑:程序博客网 时间:2024/06/05 20:55
前不久面试时,被要求手写一下,用链表实现两个字符串的加法。
好久没写链表了,当时一紧张还写错了。于是来复习一下。
思路很简单,先把两个字符串转成链表,然后再对链表进行反转,
就可以从最低位开始加了,类似于大数加法的思路。
#include <iostream>#include <cstdio>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} ListNode(int x, ListNode* l) : val(x), next(l) {}};ListNode* digitToList(string s){ ListNode* first = new ListNode(0); ListNode* current = first; for(int i=0;i<s.length();i++ ){ current->next = new ListNode(s[i]-'0'); current = current->next; } return first;}/*链表转置方法1,依次把链表的第2个结点,插入头结点和第一个结点之间*/ListNode *reverseList1(ListNode* l){ if(l==NULL)return NULL; ListNode *tmp=l->next; ListNode *p=NULL; while(tmp->next){ p=tmp->next; tmp->next=p->next; p->next=l->next; l->next=p; } return l;}/*链表转置方法2,先创建一个链表,每次在头结点后插入一个新的结点*/ListNode *reverseList2(ListNode* l){ if(l==NULL)return NULL; ListNode* first = new ListNode(0); ListNode* tmp = NULL; while(l->next){ l=l->next; tmp=first->next; first->next=new ListNode(l->val); first->next->next=tmp; } return first;}void travelList(ListNode *l){ while(l->next){ l=l->next; printf("%d-",l->val); } printf("\n");}ListNode* addTwoNumbers(ListNode* l1, ListNode* l2){ // code here ListNode *reverseL1=reverseList2(l1); ListNode *reverseL2=reverseList2(l2); travelList(reverseL1); ListNode* first = new ListNode(0); ListNode* current = first; int tmp=0; while(reverseL1->next && reverseL2->next){ reverseL1=reverseL1->next; reverseL2=reverseL2->next; int num1=reverseL1->val; int num2=reverseL2->val; current->next = new ListNode((num1+num2+tmp)%10); current = current->next; tmp=(num1+num2+tmp)/10; } while(reverseL1->next){ reverseL1 = reverseL1->next; int num1=reverseL1->val; current->next = new ListNode((num1+tmp)%10); current = current->next; tmp=(num1+tmp)/10; } while(reverseL2->next){ reverseL2 = reverseL2->next; int num2=reverseL2->val; current->next = new ListNode((num2+tmp)%10); tmp=(num2+tmp)/10; } ListNode *ansList=reverseList(first); return ansList;}int main(){ string A, B; cin>>A>>B; ListNode *l1 = digitToList(A), *l2 = digitToList(B); ListNode* res = addTwoNumbers(l1,l2); while(res->next){ res = res->next; cout<<res->val; } cout<<endl;}
阅读全文
0 0
- 链表实现两个字符串的加法(反转链表)
- 链表实现两个多项式的加法
- 实现链表的反转
- C/C++面试程序题(一)——字符串反转、链表反转的递归、非递归实现
- Java链栈实现两个大数加法
- 链表实现大数加法
- 链表反转的实现(递归反转链表,非递归反转链表)
- 反转链表的Java实现
- 反转单向链表的实现
- 链表的反转简单实现
- java实现链表的反转
- java实现链表的反转
- 实现单向链表的反转
- Java:如何实现链表的反转
- 链表的反转(java实现)
- 实现字符串的反转
- 实现字符串的反转
- 实现字符串的反转
- Mysql优化
- oracle基础知识以及部分demo
- bootstrap图标菜单按钮组件
- Android Wi-Fi wpa_suplicant的log不输出的解决办法
- 2017.07.19随笔记录近况
- 链表实现两个字符串的加法(反转链表)
- windows WAMP 配置gzip踩坑过程
- 图解HTTPS
- Android学习(十一)五布局之线性布局
- Gradle多渠道打包
- 过去未去,未来已来,中国或许将在未来几年快速成为消费服务大国,付费模式即将迎来新时代!
- Sum It Up HDU
- “Couldn't resolve resource…” Android Studio
- lombok的使用和原理