给你一个链表的头节点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 到1000个节点。链表中的每个节点,节点值:-1000 <= node.val <= 1000.
建立哈希表,key是节点值的前缀和,value是节点。
第一次循环遍历,累积前缀和,并逐一写入哈希表,重复值将自动替换为最新值。
第二次遍历,让节点指向哈希表中存在的前缀和节点,跳过中间部分的总和。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode removeZeroSumSublists(ListNode head) { ListNode dummy= new ListNode(0); dummy.next=head; Map<Integer,ListNode>seen=new HashMap<>(); int prefix=0; for(ListNode node=dummy;node!=null;node=node.next){ prefix+=node.val; seen.put(prefix,node); } prefix=0; for(ListNode node=dummy;node!=null;node=node.next){ prefix+=node.val; node.next=seen.get(prefix).next; } return dummy.next; }}