1. 题目描述
2. 解题思路
按照我们习惯的加法运算,肯定是要从个位开始相加,然后十位……,但是在链表中如果我们先运算后面的,那么接下来我们是无法找到前一位的。想要解决这个问题也很简单:链表逆置
逆置完成之后我们就可以从头开始相加了。那么接下了就是两个链表一位一位进行相加了,要注意进位问题噢。
运算也很简单,取出链表中的数据,进行相加,将结果重新构建一个结点(为了方便连接,我们可以先开辟一个头节点),然后连接到我们的头节点上,然后两个链表都往后移,进行下一位运算,一直到结束。这里要注意两个链表长度不一样,可能会遇到一个链表先走完的情况噢。看代码更好理解一些。
3. 代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
ListNode* Reverse(ListNode* head)
{
if(head == nullptr) return nullptr;
ListNode *cur = head, *prev = nullptr, *next = cur->next;
while(cur)
{
cur->next = prev;
prev = cur;
cur = next;
if(next)
next = next->next;
}
return prev;
}
ListNode* addInList(ListNode* head1, ListNode* head2)
{
if(head1 == nullptr) return head2;
if(head2 == nullptr) return head1;
ListNode* cur1 = Reverse(head1);
ListNode* cur2 = Reverse(head2);
auto head = new ListNode(-1); // 头节点
auto cur = head;
int t = 0; // 保存进位
while(cur1 || cur2 || t) // 只要有一个没运算完,就继续
{
int n = 0;
// 因为只要cur1 || cur2 || t有一个条件成立,就会进入循环,因此在循环里面要进行判断
if(cur1)
{
n += cur1->val;
cur1 = cur1->next;
}
// 同理
if(cur2)
{
n += cur2->val;
cur2 = cur2->next;
}
n += t;
t = n / 10;
n %= 10;
auto node = new ListNode(n);
cur->next = node;
cur = cur->next;
}
// 注意结束后要逆置回去噢,不理解就画图
return Reverse(head->next);
}
};