您的位置:首页 > 职场人生

程序员面试金典第二章:链表(5) 链式A+B

2017-01-09 13:09 218 查看
1.1 题目描述

有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表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,并且有一条链表没走完的时候,直接放到后面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息