题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入
[9,3,7],[6,3]
输出
{1,0,0,0}
算法设计与分析
- 实现链表的反转(数字相加从个位开始,但链表对逆序操作插入不方便)
- 按链表顺序计算数值(考虑进位、一个链表有数字剩余)
- 将链表逆序返回
代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if (pHead == NULL) return pHead;
ListNode* pre = pHead;
ListNode* curr = pre->next;
ListNode* temp1;
ListNode* temp2;
while (curr != NULL){
temp1 = pre;
temp2 = curr;
pre = curr;
curr = curr->next;
temp2->next = temp1;
}
pHead->next = NULL;
pHead = pre;
return pHead;
}
ListNode* addInList(ListNode* head1, ListNode* head2) {
if (head1 == NULL) return head2;
if (head2 == NULL) return head1;
// reverse list1
head1 = ReverseList(head1);
head2 = ReverseList(head2);
ListNode* curr1 = head1;
ListNode* curr2 = head2;
int carry = 0; // 进位
int remain = 0; // 余数
ListNode* head = NULL;
ListNode* currPos = head;
while(curr1!=NULL && curr2!=NULL){
remain = (curr1->val + curr2->val + carry) % 10;
carry = (curr1->val + curr2->val + carry) / 10;
if (head == NULL){ // 第一次插入
head = new ListNode(remain);
currPos = head;
}
else{
currPos->next = new ListNode(remain);
currPos->next->next = NULL;
currPos = currPos->next;
}
curr1 = curr1->next;
curr2 = curr2->next;
}
while (curr1 != NULL){
remain = (curr1->val + carry) % 10;
carry = (curr1->val + carry) / 10;
currPos->next = new ListNode(remain);
currPos->next->next = NULL;
currPos = currPos->next;
curr1 = curr1->next;
}
while (curr2 != NULL){
remain = (curr2->val + carry) % 10;
carry = (curr2->val + carry) / 10;
currPos->next = new ListNode(remain);
currPos->next->next = NULL;
currPos = currPos->next;
curr2 = curr2->next;
}
head = ReverseList(head);
return head;
}
};