您现在的位置是:首页 >技术教程 >2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)网站首页技术教程

2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)

HEU_firejef 2024-10-08 00:01:03
简介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) 如果发现遍历一遍数组过后并不需要删除任何数字,则代表着操作已经完成,后面就是遍历该数组建立链表即可。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。