问题
下面我会向大家介绍我的思考过程和解题思路
解题思路
首先,我们看问题提供给我们的提示部分。第一点给了我们节点的数目,第二点给了我们val的范围,而我们这道题是要让我们求和的问题,那么我们就应该估算一下我们数据的一个大概的范围为(0,2*10^8);第三条说不存在连续两个val=0的节点,我们就可以在计算时,每遍历到一个val=0的节点时,就相当于把它和它上一个0之间的节点遍历完了,我们直接将其保存下来,继续遍历即可;第四点告诉我们开头和结尾节点的val都=0,这个就相当于告诉我们了一些特殊情况的处理,当遍历到最后一个部分时,我们也可以以val=0为判断依据结束求和。如果没有这个条件,我们判断的条件就需要改为Node.val==0||Node.next==NULL。
然后根据我们对题目和提示的分析我们定义一个p指针用来遍历储存求得的和的链表(在这里我将求得的和也保存在了原链表中),定义一个q指针用来遍历原链表,我们在每次遍历到val=0的节点时将和sum保存下来,并将其重新赋值为0,用来继续下一个部分的求和。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeNodes(ListNode* head) {
ListNode* p=head;//遍历求得的和的链表
ListNode* q=head->next;//遍历原链表
int sum=0;//用来计算每一部分的和
while(q!=NULL)
{
if(q->val==0)
{//这里我做了一个处理,先让p向后遍历了一步再将sum的值保存下来,这样在最后返回结果时需要返回head->next。如果先保存和再让p向后走,到了最后返回head,但会将原链表中p的下一个节点也保存在我们的结果链表中,得不偿失。
p=p->next;
p->val=sum;
sum=0;
}
else
{
sum+=q->val;
}
q=q->next;
}
p->next=nullptr;
return head->next;
}
};