「这是我参与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是点赞!
\