【算法通关】1171. 从链表中删去总和值为零的连续节点——前缀和

·  阅读 612

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

字节二面这个题,太难搞了

——leetcode此题热评

前言

大家好,我是一条,欢迎来到我的算法频道。

只做有趣的算法题,只为面试写算法

Question

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

难度:中等

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

思路: 链表的前缀和, 增加一个头结点 */
/* 前驱结点pre, 求和第一个结点p, 最后一个结点q */
/* 统计[p,q]链表的和sum, 当sum=0时, 删除[p,q] */
/* sum != 0时, 双重循环不断刷新sum值          */
复制代码

Code

/**
 * @author 一条coding
 */
class Solution {
//    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;
//        }
//    }
    public ListNode removeZeroSumSublists(ListNode head) {
        // 前缀和
        HashMap<Integer, ListNode> map = new HashMap<>();
        ListNode cur=head;
        ListNode dummy = new ListNode(0, head);
        map.put(0,dummy);
​
        int sum = 0;
        while (cur!=null){
            sum+=cur.val;
            if (map.containsKey(sum)){
               // 删除
                ListNode node = map.get(sum);
                ListNode del = node.next;
                // 从 node.next到cur全部删除
                node.next=cur.next;
                // 维护map ,循环删除前缀和
                int delSumKey=sum;
                while (del!=cur){
                    // 注意这几步的顺序
                    delSumKey+=del.val;
                    map.remove(delSumKey);
                    del=del.next;
                }
            }else {
                map.put(sum,cur);
            }
            cur=cur.next;
        }
        return dummy.next;
    }
}
复制代码

最后

点赞,点赞,还TMD是点赞!

\

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改