例题:
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
数据案例
输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 也是正确的。
输入:head = [1,2,3,-3,4]
输出:[1,2,4]
输入:head = [1,2,3,-3,-2]
输出:[1]
之前有做过找最大前缀和的问题,感觉这个连续最大为0的链表题也应该类似。但是对于第一次解决链表前缀和问题,思路想了很久。
思路:
head = [1,2,-3,3,1]
1、对于这组数据来讲,我们可以依次得到他的每一位的前缀和是[1,3,0,3,4],有了这一步,思路就很清晰了,只要找到一样的前缀和,两个数之间的数字都是满足连续和为0的
2、特殊情况的处理:
- [-1,1]这种刚好从头开始满足条件的数据案例,需要增加哑结点特殊处理
- [1,2,-3,3,1,-1]得到的子序列和是[1,3,0,3,4,3]已经断过链再次出现断链前内和一样的情况,第二次断链必须是从第一个3开始断链,所以每次断链应该把丢掉的数据及时处理
3、如何实现?这也是一个难题。最后我选择了用hashMap存放连续和 和 结点地址。大量空间换了时间,但是这样的效率依然不是很高
//前缀和的问题
public ListNode removeZeroSumSublists(ListNode head) {
ListNode dymmynode = n