当前位置: 首页 > 图灵资讯 > 技术篇> leetcode 1171. 从链表中删去总和值为零的连续节点

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

来源:图灵教育
时间:2023-06-12 09:22:08

给你一个链表的头节点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;    }}