LeetCode 题解工作台
从链表中删去总和值为零的连续节点
给你一个链表的头节点 head ,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。 删除完毕后,请你返回最终结果链表的头节点。 你可以返回任何满足题目要求的答案。 (注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。) 示例 1:…
2
题型
6
代码语言
3
相关题
当前训练重点
中等 · 链表指针操作
答案摘要
若链表节点的两个前缀和相等,说明两个前缀和之间的连续节点序列的和为 ,那么可以消去这部分连续节点。 我们第一次遍历链表,用哈希表 记录前缀和以及对应的链表节点,对于同一前缀和 ,后面出现的节点覆盖前面的节点。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 链表指针操作 题型思路
题目描述
给你一个链表的头节点 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.
解题思路
方法一:前缀和 + 哈希表
若链表节点的两个前缀和相等,说明两个前缀和之间的连续节点序列的和为 ,那么可以消去这部分连续节点。
我们第一次遍历链表,用哈希表 记录前缀和以及对应的链表节点,对于同一前缀和 ,后面出现的节点覆盖前面的节点。
接下来,我们再次遍历链表,若当前节点 的前缀和 在 出现,说明 与 之间的所有节点和为 ,我们直接修改 的指向,即 ,这样就删去了这部分和为 的连续节点。继续往后遍历,删除所有和为 的连续节点。
最后返回链表的头节点 。
时间复杂度 ,空间复杂度 。其中 为链表的长度。
# 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
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(n) |
面试官常问的追问
外企场景- 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.
常见陷阱
外企场景- 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.
进阶变体
外企场景- 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.