您现在的位置是:首页 >技术教程 >2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)网站首页技术教程
2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)
简介2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)
2023-03-29每日一题
一、题目编号
1171. 从链表中删去总和值为零的连续节点
二、题目链接
三、题目描述
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
提示:
- 给你的链表中可能有 1 到 1000 个节点。
- 对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.
四、解题代码
/**
* 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* removeZeroSumSublists(ListNode* head) {
vector<int> nums;
while(head != nullptr){
nums.push_back(head->val);
head = head->next;
}
while(1){
unordered_map<int, int> hash;
int flag1 = 0;
vector<int> res;
int num = 0;
int n = nums.size();
for(int i = 0; i < n; ++i){
num += nums[i];
res.push_back(nums[i]);
if(hash[num] != 0 || num == 0){
flag1 = 1;
int index = num;
res.pop_back();
num -= nums[i];
int j = res.size()-1;
while(num != index){
hash[num] = 0;
num -= res[j];
--j;
res.pop_back();
}
hash[num] = 0;
continue;
}
hash[num] = 1;
}
nums = res;
if(flag1 == 0){
break;
}
}
ListNode* Dummyhead = new ListNode();
ListNode* Head = Dummyhead;
int n = nums.size();
for(int i = 0; i < n; ++i){
ListNode *node = new ListNode(nums[i]);
Head->next = node;
Head = Head->next;
}
return Dummyhead->next;
}
};
五、解题思路
(1) 首先我们将链表里面的数字全部放入进数组里面。接下来我们所要的操作就是让这个数组最终转化为结果数组,再依据这个数组来建立链表即可。
(2) 接下来要弄懂一个道理,比如1 、 2、 3、 -6 这四个数字,得到1、2、3、-6的和为0,那么这四个数字就可以从数组中删除了。(因为前缀和为0)
(3) 如果是-5、1、2、3、-6这些数字呢,到1的时候前缀为-4,到-6的时候前缀和也为-4,这样我们所需要做的就是依次遍历数组,如果发现前缀和已经出现过了,那么就需要删除前缀和相同的之间的这些数字。
(4) 如果发现遍历一遍数组过后并不需要删除任何数字,则代表着操作已经完成,后面就是遍历该数组建立链表即可。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。