美文网首页
手撕LeetCode #1171——Python

手撕LeetCode #1171——Python

作者: 烟花如雨旧故里 | 来源:发表于2020-10-22 22:45 被阅读0次

1171. 从链表中删去总和值为零的连续结点
给你一个链表的头结点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续结点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头结点。

示例:

输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 也是正确的。

解题思路:
找到题目的关键点:和值为0的连续结点。我们来看看示例,如果我们选择[-3, 3]这个区间,那么从左至右累加各个结点的值在这个区间前后是没有变化的。也就是说,用list来表示链表的累加和:[1, 3, 0, 3, 4],可以看到Node(2)和Node(3)处的累加和是相等的。这就是解题的关键,找到累加和不变的区间,让区间前一个Node的下一个Node等于区间结束后紧跟的下一个Node。

代码如下:

class Solution:
    def removeZeroSumSublists(self, head: ListNode) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        sumMap = {}
        node = dummy
        sum_node = 0
        while node:
            sum_node += node.val
            sumMap[sum_node] = node
            node = node.next
        
        sum_node = 0
        node = dummy
        while node:
            sum_node += node.val
            node.next = sumMap[sum_node].next
            node = node.next
        return dummy.next

时间复杂度:O(N),遍历结点;
空间复杂度:O(N) ,存储结点的累加和。

解法转自 Java HashMap 两次遍历即可

相关文章

网友评论

      本文标题:手撕LeetCode #1171——Python

      本文链接:https://www.haomeiwen.com/subject/tgcmmktx.html