File tree 4 files changed +139
-37
lines changed
solution/1100-1199/1171.Remove Zero Sum Consecutive Nodes from Linked List
4 files changed +139
-37
lines changed Original file line number Diff line number Diff line change 44
44
<li>对于链表中的每个节点,节点的值:<code>-1000 <= node.val <= 1000</code>.</li>
45
45
</ul >
46
46
47
-
48
47
## 解法
49
48
50
49
<!-- 这里可写通用的实现逻辑 -->
51
50
51
+ “前缀和 + 哈希表”实现。
52
+
53
+ 若链表节点的两个前缀和相等,说明两个前缀和之间的连续节点序列的和为 0,那么可以消去这部分连续节点。
54
+
55
+ 第一次遍历链表,用哈希表 ` pre_sum_node ` 记录前缀和以及对应的链表节点,同一前缀和 s,** 后者的链表节点覆盖前者** 。
56
+
57
+ 第二次遍历链表,若当前节点 cur 的前缀和 s 在 ` pre_sum_node ` 出现,说明 cur 与 pre_sum_node[ s] 之间的所有节点和为 0,直接修改 cur 的指向,` cur.next = pre_sum_node[s].next ` ,就删去了这部分和为 0 的连续节点。
58
+
52
59
<!-- tabs:start -->
53
60
54
61
### ** Python3**
55
62
56
63
<!-- 这里可写当前语言的特殊实现逻辑 -->
57
64
58
65
``` python
59
-
66
+ # Definition for singly-linked list.
67
+ # class ListNode:
68
+ # def __init__(self, x):
69
+ # self.val = x
70
+ # self.next = None
71
+
72
+ class Solution :
73
+ def removeZeroSumSublists (self , head : ListNode) -> ListNode:
74
+ dummy = ListNode(0 )
75
+ dummy.next = head
76
+ s, cur = 0 , dummy
77
+ pre_sum_node = {}
78
+ while cur:
79
+ s += cur.val
80
+ pre_sum_node[s] = cur
81
+ cur = cur.next
82
+ s, cur = 0 , dummy
83
+ while cur:
84
+ s += cur.val
85
+ cur.next = pre_sum_node[s].next
86
+ cur = cur.next
87
+ return dummy.next
60
88
```
61
89
62
90
### ** Java**
63
91
64
92
<!-- 这里可写当前语言的特殊实现逻辑 -->
65
93
66
94
``` java
67
-
95
+ /**
96
+ * Definition for singly-linked list.
97
+ * public class ListNode {
98
+ * int val;
99
+ * ListNode next;
100
+ * ListNode(int x) { val = x; }
101
+ * }
102
+ */
103
+ class Solution {
104
+ public ListNode removeZeroSumSublists (ListNode head ) {
105
+ ListNode dummy = new ListNode (0 );
106
+ dummy. next = head;
107
+ Map<Integer , ListNode > preSumNode = new HashMap<> ();
108
+ int s = 0 ;
109
+ for (ListNode cur = dummy; cur != null ; cur = cur. next) {
110
+ s += cur. val;
111
+ preSumNode. put(s, cur);
112
+ }
113
+ s = 0 ;
114
+ for (ListNode cur = dummy; cur != null ; cur = cur. next) {
115
+ s += cur. val;
116
+ cur. next = preSumNode. get(s). next;
117
+ }
118
+ return dummy. next;
119
+ }
120
+ }
68
121
```
69
122
70
123
### ** ...**
Original file line number Diff line number Diff line change 6
6
7
7
<p >Given the <code >head</code > of a linked list, we repeatedly delete consecutive sequences of nodes that sum to <code >0</code > until there are no such sequences.</p >
8
8
9
-
10
-
11
9
<p >After doing so, return the head of the final linked list.  ; You may return any such answer.</p >
12
10
13
-
14
11
<p >  ; </p >
15
12
<p >(Note that in the examples below, all sequences are serializations of <code >ListNode</code > objects.)</p >
16
13
44
41
<li>Each node in the linked list has <code>-1000 <= node.val <= 1000</code>.</li>
45
42
</ul >
46
43
47
-
48
44
## Solutions
49
45
50
46
<!-- tabs:start -->
51
47
52
48
### ** Python3**
53
49
54
50
``` python
55
-
51
+ # Definition for singly-linked list.
52
+ # class ListNode:
53
+ # def __init__(self, x):
54
+ # self.val = x
55
+ # self.next = None
56
+
57
+ class Solution :
58
+ def removeZeroSumSublists (self , head : ListNode) -> ListNode:
59
+ dummy = ListNode(0 )
60
+ dummy.next = head
61
+ s, cur = 0 , dummy
62
+ pre_sum_node = {}
63
+ while cur:
64
+ s += cur.val
65
+ pre_sum_node[s] = cur
66
+ cur = cur.next
67
+ s, cur = 0 , dummy
68
+ while cur:
69
+ s += cur.val
70
+ cur.next = pre_sum_node[s].next
71
+ cur = cur.next
72
+ return dummy.next
56
73
```
57
74
58
75
### ** Java**
59
76
60
77
``` java
61
-
78
+ /**
79
+ * Definition for singly-linked list.
80
+ * public class ListNode {
81
+ * int val;
82
+ * ListNode next;
83
+ * ListNode(int x) { val = x; }
84
+ * }
85
+ */
86
+ class Solution {
87
+ public ListNode removeZeroSumSublists (ListNode head ) {
88
+ ListNode dummy = new ListNode (0 );
89
+ dummy. next = head;
90
+ Map<Integer , ListNode > preSumNode = new HashMap<> ();
91
+ int s = 0 ;
92
+ for (ListNode cur = dummy; cur != null ; cur = cur. next) {
93
+ s += cur. val;
94
+ preSumNode. put(s, cur);
95
+ }
96
+ s = 0 ;
97
+ for (ListNode cur = dummy; cur != null ; cur = cur. next) {
98
+ s += cur. val;
99
+ cur. next = preSumNode. get(s). next;
100
+ }
101
+ return dummy. next;
102
+ }
103
+ }
62
104
```
63
105
64
106
### ** ...**
Original file line number Diff line number Diff line change 8
8
*/
9
9
class Solution {
10
10
public ListNode removeZeroSumSublists (ListNode head ) {
11
- Map <Integer , ListNode > map = new HashMap <>();
12
- boolean isZeroSum = true ;
13
-
14
- while (isZeroSum ) {
15
- isZeroSum = false ;
16
- int sum = 0 ;
17
- ListNode temp = head ;
18
-
19
- while (temp != null ) {
20
- sum += temp .val ;
21
-
22
- if (sum == 0 ) {
23
- head = temp .next ;
24
- map .clear ();
25
- isZeroSum = true ;
26
- break ;
27
- } else if (map .containsKey (sum )) {
28
- map .get (sum ).next = temp .next ;
29
- map .clear ();
30
- isZeroSum = true ;
31
- break ;
32
- }
33
-
34
- map .put (sum , temp );
35
- temp = temp .next ;
36
- }
11
+ ListNode dummy = new ListNode (0 );
12
+ dummy .next = head ;
13
+ Map <Integer , ListNode > preSumNode = new HashMap <>();
14
+ int s = 0 ;
15
+ for (ListNode cur = dummy ; cur != null ; cur = cur .next ) {
16
+ s += cur .val ;
17
+ preSumNode .put (s , cur );
37
18
}
38
-
39
- return head ;
19
+ s = 0 ;
20
+ for (ListNode cur = dummy ; cur != null ; cur = cur .next ) {
21
+ s += cur .val ;
22
+ cur .next = preSumNode .get (s ).next ;
23
+ }
24
+ return dummy .next ;
40
25
}
41
26
}
Original file line number Diff line number Diff line change
1
+ # Definition for singly-linked list.
2
+ # class ListNode:
3
+ # def __init__(self, x):
4
+ # self.val = x
5
+ # self.next = None
6
+
7
+ class Solution :
8
+ def removeZeroSumSublists (self , head : ListNode ) -> ListNode :
9
+ dummy = ListNode (0 )
10
+ dummy .next = head
11
+ s , cur = 0 , dummy
12
+ pre_sum_node = {}
13
+ while cur :
14
+ s += cur .val
15
+ pre_sum_node [s ] = cur
16
+ cur = cur .next
17
+ s , cur = 0 , dummy
18
+ while cur :
19
+ s += cur .val
20
+ cur .next = pre_sum_node [s ].next
21
+ cur = cur .next
22
+ return dummy .next
You can’t perform that action at this time.
0 commit comments