一、题目
二、思路
由于给的是单链表,计算相加的结果要从低位开始计算,所以需要从后向前遍历结点,所以首先要先将给出的两个链表逆转。
逆转链表后,从两个链表的新首结点(原链表尾结点)开始遍历相加,sum变量表示当前两个结点的值相加的和余10得到的结果,flag为进位标志。用sum的值创建一个新的链表节点,用头插法创建新结果链表(头插法会和逆置后的链表顺序相反,也就是和原链表的顺序相同),若所有节点相加完后仍有进位,则再创建一个节点(节点值必为1),插入到头结点的后面。
三、代码
class Solution {
public:
ListNode* addInList(ListNode* head1, ListNode* head2) {
ListNode* pre1 = NULL;
ListNode* p1 = head1;
ListNode* pre2 = NULL;
ListNode* p2 = head2;
while(p1){ //逆转head1链表
ListNode* tmp = p1->next;
p1->next = pre1;
pre1 = p1;
p1 = tmp;
}
while(p2){ //逆置head2链表
ListNode* tmp = p2->next;
p2->next = pre2;
pre2 = p2;
p2 = tmp;
}
int flag = 0; //进位标志
int sum = 0; //当前节点之和(余10)
ListNode* dummy = new ListNode(-1); //新链表的头结点
ListNode* p = dummy;
while(pre1 || pre2){
int val1=0, val2 = 0;
if(pre1){
val1 = pre1->val;
pre1 = pre1->next;
}
if(pre2){
val2 = pre2->val;
pre2 = pre2->next;
}
sum = (val1 + val2 + flag) % 10;
flag = (val1 + val2 +flag) / 10;
// 头插法创建新链表
ListNode* tmpnode = new ListNode(sum);
tmpnode->next = p->next;
p->next = tmpnode;
}
if(flag){ //第一个结点相加后有进位
ListNode* tmpnode = new ListNode(1);
tmpnode->next = p->next;
p->next = tmpnode;
}
return dummy->next;
}
};