zoukankan      html  css  js  c++  java
  • LeetCode 1171. 从链表中删去总和值为零的连续节点

    1171. 从链表中删去总和值为零的连续节点

    Difficulty: 中等

    给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

    删除完毕后,请你返回最终结果链表的头节点。

    你可以返回任何满足题目要求的答案。

    (注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)

    示例 1:

    输入:head = [1,2,-3,3,1]
    输出:[3,1]
    提示:答案 [1,2,1] 也是正确的。
    

    示例 2:

    输入:head = [1,2,3,-3,4]
    输出:[1,2,4]
    

    示例 3:

    输入:head = [1,2,3,-3,-2]
    输出:[1]
    

    提示:

    • 给你的链表中可能有 1 到 1000 个节点。
    • 对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.

    Solution

    Language: ****

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    ​
    ​
    class Solution:
        def removeZeroSumSublists(self, head: ListNode) -> ListNode:
            dummy = p = ListNode(-1)
            dummy.next = head
            prefix, d = 0, {}
            # 前缀和
            while p:
                # 求节点累计的和
                prefix += p.val
                # 从hash表中找到满足累计和的节点,如果没有则把p赋给node
                node = d.get(prefix, p)
                # 当累计和出现在hash表中的时候,把从第一个符合累计和的节点以及它后面的节点从哈希表中移除
                while prefix in d:
                    d.popitem()
                # 直接从node.next到p.next,中间的节点全部忽略
                d[prefix] = node
                p = p.next
                node.next = p
            return dummy.next
    
  • 相关阅读:
    bzoj1096 [ZJOI2007]仓库建设
    bzoj2054 疯狂的馒头
    bzoj1597 [Usaco2008 Mar]土地购买
    【洛谷P1083】[NOIP2012]借教室
    【洛谷P1367】蚂蚁
    【洛谷P1886】滑动窗口
    【洛谷P2216】[HAOI2007]理想的正方形
    【题解】洛谷P2914[USACO08OCT]断电Power Failure
    【数据结构】数组模拟链表
    【题解】洛谷P1002过河卒
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14225634.html
Copyright © 2011-2022 走看看