程序员面试金典第二章:链表(5) 链式A+B
2017-01-09 13:09
218 查看
1.1 题目描述
1.2 解题思路
tips:
1.链表A或者B为nullptr的时候,可以直接返回另一个
2.当一条链表走完的时候,可能carry不为0,需要计算计算
3.当carry为0,并且有一条链表没走完的时候,直接放到后面
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。 给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。 测试样例: {1,2,3},{3,2,1} 返回:{4,4,4}
1.2 解题思路
思路1:每一次将两个链表的同一位取出并与进位相加得出这一位的值于进位的值,一直加,直到有一个链表走到尽头,这里需要注意可能还有进位项,所以需要继续计算。(数据处理上有两种,一个是申请一个新的链表记录结果,另一个就是让A或者B记录结果) 时间复杂度O(n), 空间复杂度O(1)或者O(1)
class Plus { public: ListNode* plusAB(ListNode* a, ListNode* b) { // write code here if(a == nullptr) return b; if(b == nullptr) return a; int carry = 0; ListNode * preHead = new ListNode(0); ListNode * p = preHead; ListNode * pA = a; ListNode * pB = b; while(pA != nullptr && pB != nullptr) { int res = (pA ->val + pB ->val + carry) % 10; carry = (pA ->val + pB ->val + carry) / 10; p ->next = new ListNode(res); p = p ->next; pA = pA ->next; pB = pB ->next; } if(pB != nullptr) pA = pB; while(pA != nullptr && carry != 0) { int res = (pA ->val + carry) % 10; carry = (pA ->val + carry) / 10; p ->next = new ListNode(res); p = p ->next; pA = pA ->next; } if(carry != 0) { p ->next = new ListNode(carry); p = p ->next; } if(pA != nullptr) p ->next = pA; return preHead ->next; } };
tips:
1.链表A或者B为nullptr的时候,可以直接返回另一个
2.当一条链表走完的时候,可能carry不为0,需要计算计算
3.当carry为0,并且有一条链表没走完的时候,直接放到后面
相关文章推荐
- 程序员面试金典:链表--链式A+B、回文链表
- 程序员面试金典第二章:链表(2) 链表中倒数第k个结点
- 程序员面试金典第二章:链表(3) 链表中倒数第k个结点
- 程序员面试金典第二章:链表(4) 链表分割
- 程序员面试金典第二章:链表(7)回文链表
- 程序员面试金典第二章:链表(6) 链表环路
- 程序员面试金典题解 链表分割
- 数据结构学习----线性表的链式表示之升序排序的单链表(Java实现)
- 链式前向星|前向星|STL中vector模拟链表(图的存储)
- 单链表-链式存储-Java实现
- 第二章作业题3-链表(2)
- 数据结构学习之路-第二章:静态单链表
- 线性表的链式存储(单链表)的c语言实现
- 线性表的链式实现(单链表)——无独立表头的实现
- 【9-1-5】简单链表,链式存储
- 第二章 2.4 线性表的第二类:链式数组表
- 线性表的链式存储(链表)
- [程序员面试金典]-链表分割
- 链式数据结构 单链表
- C语言单链表(线性表的链式存储)的实现