文章目录
- 1. 题目描述
- 2. 解题思路
- 3. 代码实现
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);}
};