LeetCode 题解工作台

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

给你一个链表的头节点 head ,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。 删除完毕后,请你返回最终结果链表的头节点。 你可以返回任何满足题目要求的答案。 (注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。) 示例 1:…

category

2

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 链表指针操作

bolt

答案摘要

若链表节点的两个前缀和相等,说明两个前缀和之间的连续节点序列的和为 ,那么可以消去这部分连续节点。 我们第一次遍历链表,用哈希表 记录前缀和以及对应的链表节点,对于同一前缀和 ,后面出现的节点覆盖前面的节点。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 链表指针操作 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

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

解题思路

方法一:前缀和 + 哈希表

若链表节点的两个前缀和相等,说明两个前缀和之间的连续节点序列的和为 00,那么可以消去这部分连续节点。

我们第一次遍历链表,用哈希表 lastlast 记录前缀和以及对应的链表节点,对于同一前缀和 ss,后面出现的节点覆盖前面的节点。

接下来,我们再次遍历链表,若当前节点 curcur 的前缀和 sslastlast 出现,说明 curcurlast[s]last[s] 之间的所有节点和为 00,我们直接修改 curcur 的指向,即 cur.next=last[s].nextcur.next = last[s].next,这样就删去了这部分和为 00 的连续节点。继续往后遍历,删除所有和为 00 的连续节点。

最后返回链表的头节点 dummy.nextdummy.next

时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。其中 nn 为链表的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 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: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode(next=head)
        last = {}
        s, cur = 0, dummy
        while cur:
            s += cur.val
            last[s] = cur
            cur = cur.next
        s, cur = 0, dummy
        while cur:
            s += cur.val
            cur.next = last[s].next
            cur = cur.next
        return dummy.next
speed

复杂度分析

指标
时间O(n)
空间O(n)
psychology

面试官常问的追问

外企场景
  • question_mark

    The candidate should demonstrate understanding of linked-list traversal and pointer manipulation.

  • question_mark

    Look for the ability to optimize using a hash map to track sums efficiently.

  • question_mark

    Evaluate how well the candidate handles edge cases such as lists with no zero-sum sequences or lists that are completely zero-sum.

warning

常见陷阱

外企场景
  • error

    Failing to properly update pointers when removing zero-sum sequences, leading to lost nodes.

  • error

    Overlooking edge cases like empty lists or lists without any zero-sum sequences.

  • error

    Misusing the hash map to track sums, which can cause incorrect removal of nodes.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Using a different approach for removing zero-sum sequences, such as a stack-based solution.

  • arrow_right_alt

    Handling cases where the linked list contains only one node or very small lists.

  • arrow_right_alt

    Returning multiple possible outputs based on how the zero-sum sequences are removed.

help

常见问题

外企场景

从链表中删去总和值为零的连续节点题解:链表指针操作 | LeetCode #1171 中等