题目描述:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表
首先看到这个题,这就是一个普通的加法题,小学学的那种,但是这道题唯一的难点就是链表是由高位指向地位,但是我们平时做的计算都是有地位向高位进行计算,所以就需要我们进行链表倒置,倒置完成后就可以进行加法计算了,
倒置的方法:可以利用栈,也可以利用链表倒置函数等。我们这里用栈进行倒置
将两个链表都放入栈中,在出栈的时候链表中数字的顺序就是倒置的了,
stack<int> s1, s2;
ListNode* hl1 = l1;
ListNode* hl2 = l2;
while (hl1)
{
s1.push(hl1->val);
hl1 = hl1->next;
}
while (hl2)
{
s2.push(hl2->val);
hl2 = hl2->next;
}
如图所示的代码,就可以将链表在之后的就是倒置的了
进行完倒置之后,我们要考虑的就是计算了,加法计算中唯一的难处就是需要进位,那么我们用一个值来记录此次计算是否进位,
这个题主要考虑的就是细节问题,如果两个数的长短不一样,我们计算的时候有一个树已经计算完了,这时候我们就要让这个数如果计算完了让他赋值为0,
还有就是最后的我们链表的插入,因为我们从低位开始计算我已我们在插入的时候已经计算玩的数据要在后面,所以采用头插法。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> s1, s2;
ListNode* hl1 = l1;
ListNode* hl2 = l2;
while (hl1)
{
s1.push(hl1->val);
hl1 = hl1->next;
}
while (hl2)
{
s2.push(hl2->val);
hl2 = hl2->next;
}
int index = 0;//记录是否进位 如果进位下一次计算会加上
ListNode* head = nullptr;
while (!s1.empty()||!s2.empty()||index!=0)//需要将index!=0加上,考虑到最后一位没有计算的还需要在计算一次
{
int n1 = s1.empty() ? 0 : s1.top();
int n2 = s2.empty() ? 0 : s2.top();
if (!s1.empty()) s1.pop();
if (!s2.empty()) s2.pop();
int sum = n1 + n2 + index;
index = sum / 10;
sum = sum % 10;
ListNode* node = new ListNode(sum);//头插法
node->next = head; //插入节点时插入到最前方,才能得到正确结果
head = node;
}
return head;
}
感谢你的此次观看,如有不足请多指教,一位刚入门的程序员。