Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum to 0 until there are no such sequences.
After doing so, return the head of the final linked list.  You may return any such answer.
(Note that in the examples below, all sequences are serializations of ListNode objects.)
Example 1:
Input: head = [1,2,-3,3,1]
Output: [3,1]
Note: The answer [1,2,1] would also be accepted.
Example 2:
Input: head = [1,2,3,-3,4]
Output: [1,2,4]
Example 3:
Input: head = [1,2,3,-3,-2]
Output: [1]
Constraints:
The given linked list will contain between 1 and 1000 nodes.
Each node in the linked list has -1000 <= node.val <= 1000.
from math import floor
from math import ceil
from math import sqrt
from collections import deque
import numpy
from _collections import deque
#from _ast import Num # LC doesn't like this
from heapq import *
from typing import List
import random

MOD = int(1e9 + 7)
BASE = 256
\"\"\"
Maintain a v to list mapping
this is the complete stale of final answer
two states to maintain
1. ansT


\"\"\"


# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def removeZeroSumSublists(self, head: ListNode) -> ListNode:
        vToN = {}
        ps = 0
        vToN[0] = None

        curT = head
        ansH = None
        ansT = None

        while curT:
            newPs = ps + curT.val
            #print(newPs, vToN)

            if newPs in vToN:
                newAnsT = vToN[newPs]
                if newAnsT:

                    tempT = newAnsT
                    tempPs = newPs
                    while tempT != ansT:
                        tempT = tempT.next
                        tempPs += tempT.val
                        del vToN[tempPs]
                        
                    ansT = newAnsT
                    ansT.next = None
                else:
                    ansH = None
                    ansT = None
                    vToN.clear()
                    vToN[0] = None
            else:
                if ansT:
                    ansT.next = curT
                else:
                    ansH = curT
                ansT = curT
                vToN[newPs] = curT
            ps = newPs
            curT = curT.next
        
        
        return ansH


def toLL(l):
    head = ListNode(l[0])
    tail = head
    for i in range(1, len(l)):
        node = ListNode(l[i])
        tail.next = node
        tail = node
    return head

def pl(head):
    while head:
        print(head.val)
        head = head.next
\"\"\"
S = Solution()
head = [1,2,3,-3,-2]
head = [1,2,3,-3,3]
head = [1,2,3,-3,4]
head = [1,2,-3,3,1]
head = [1, -1]
pl(S.removeZeroSumSublists(toLL(head)))
#S.removeZeroSumSublists(None)
\"\"\"
from math import floor
from math import ceil
from math import sqrt
from collections import deque
import numpy
from _collections import deque
#from _ast import Num # LC doesn't like this
from heapq import *
from typing import List
import random

MOD = int(1e9 + 7)
BASE = 256
\"\"\"
Maintain a v to list mapping
this is the complete stale of final answer
two states to maintain
1. ansT


\"\"\"


# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def removeZeroSumSublists(self, head: ListNode) -> ListNode:
        vToN = {}
        ps = 0
        vToN[0] = None

        curT = head
        ansH = None
        ansT = None

        while curT:
            newPs = ps + curT.val
            #print(newPs, vToN)

            if newPs in vToN:
                newAnsT = vToN[newPs]
                if newAnsT:

                    tempT = newAnsT
                    tempPs = newPs
                    while tempT != ansT:
                        tempT = tempT.next
                        tempPs += tempT.val
                        del vToN[tempPs]
                        
                    ansT = newAnsT
                    ansT.next = None
                else:
                    ansH = None
                    ansT = None
                    vToN.clear()
                    vToN[0] = None
            else:
                if ansT:
                    ansT.next = curT
                else:
                    ansH = curT
                ansT = curT
                vToN[newPs] = curT
            ps = newPs
            curT = curT.next
        
        
        return ansH


def toLL(l):
    head = ListNode(l[0])
    tail = head
    for i in range(1, len(l)):
        node = ListNode(l[i])
        tail.next = node
        tail = node
    return head

def pl(head):
    while head:
        print(head.val)
        head = head.next
\"\"\"
S = Solution()
head = [1,2,3,-3,-2]
head = [1,2,3,-3,3]
head = [1,2,3,-3,4]
head = [1,2,-3,3,1]
head = [1, -1]
pl(S.removeZeroSumSublists(toLL(head)))
#S.removeZeroSumSublists(None)
\"\"\"