|
56 | 56 |
|
57 | 57 | 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是链表的长度。
|
58 | 58 |
|
| 59 | +我们也可以不使用数组 $nums$,直接遍历链表,维护一个从栈底到栈顶单调递减的栈 $stk$,如果当前元素比栈顶元素大,则将栈顶元素出栈,直到当前元素小于等于栈顶元素。然后,如果栈不为空,则将栈顶元素的 $next$ 指针指向当前元素,否则将答案链表的虚拟头节点的 $next$ 指针指向当前元素。最后,将当前元素入栈,继续遍历链表。 |
| 60 | + |
| 61 | +遍历结束后,将虚拟头节点的 $next$ 指针作为答案返回。 |
| 62 | + |
| 63 | +时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是链表的长度。 |
| 64 | + |
59 | 65 | <!-- tabs:start -->
|
60 | 66 |
|
61 | 67 | ### **Python3**
|
@@ -87,6 +93,29 @@ class Solution:
|
87 | 93 | return dummy.next
|
88 | 94 | ```
|
89 | 95 |
|
| 96 | +```python |
| 97 | +# Definition for singly-linked list. |
| 98 | +# class ListNode: |
| 99 | +# def __init__(self, val=0, next=None): |
| 100 | +# self.val = val |
| 101 | +# self.next = next |
| 102 | +class Solution: |
| 103 | + def removeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]: |
| 104 | + dummy = ListNode(next=head) |
| 105 | + cur = head |
| 106 | + stk = [] |
| 107 | + while cur: |
| 108 | + while stk and stk[-1].val < cur.val: |
| 109 | + stk.pop() |
| 110 | + if stk: |
| 111 | + stk[-1].next = cur |
| 112 | + else: |
| 113 | + dummy.next = cur |
| 114 | + stk.append(cur) |
| 115 | + cur = cur.next |
| 116 | + return dummy.next |
| 117 | +``` |
| 118 | + |
90 | 119 | ### **Java**
|
91 | 120 |
|
92 | 121 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
@@ -127,6 +156,37 @@ class Solution {
|
127 | 156 | }
|
128 | 157 | ```
|
129 | 158 |
|
| 159 | +```java |
| 160 | +/** |
| 161 | + * Definition for singly-linked list. |
| 162 | + * public class ListNode { |
| 163 | + * int val; |
| 164 | + * ListNode next; |
| 165 | + * ListNode() {} |
| 166 | + * ListNode(int val) { this.val = val; } |
| 167 | + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } |
| 168 | + * } |
| 169 | + */ |
| 170 | +class Solution { |
| 171 | + public ListNode removeNodes(ListNode head) { |
| 172 | + ListNode dummy = new ListNode(0, head); |
| 173 | + Deque<ListNode> stk = new ArrayDeque<>(); |
| 174 | + for (ListNode cur = head; cur != null; cur = cur.next) { |
| 175 | + while (!stk.isEmpty() && stk.peekLast().val < cur.val) { |
| 176 | + stk.pollLast(); |
| 177 | + } |
| 178 | + if (!stk.isEmpty()) { |
| 179 | + stk.peekLast().next = cur; |
| 180 | + } else { |
| 181 | + dummy.next = cur; |
| 182 | + } |
| 183 | + stk.offerLast(cur); |
| 184 | + } |
| 185 | + return dummy.next; |
| 186 | + } |
| 187 | +} |
| 188 | +``` |
| 189 | + |
130 | 190 | ### **C++**
|
131 | 191 |
|
132 | 192 | ```cpp
|
@@ -166,6 +226,39 @@ public:
|
166 | 226 | };
|
167 | 227 | ```
|
168 | 228 |
|
| 229 | +```cpp |
| 230 | +/** |
| 231 | + * Definition for singly-linked list. |
| 232 | + * struct ListNode { |
| 233 | + * int val; |
| 234 | + * ListNode *next; |
| 235 | + * ListNode() : val(0), next(nullptr) {} |
| 236 | + * ListNode(int x) : val(x), next(nullptr) {} |
| 237 | + * ListNode(int x, ListNode *next) : val(x), next(next) {} |
| 238 | + * }; |
| 239 | + */ |
| 240 | +class Solution { |
| 241 | +public: |
| 242 | + ListNode* removeNodes(ListNode* head) { |
| 243 | + ListNode* dummy = new ListNode(0, head); |
| 244 | + ListNode* cur = head; |
| 245 | + vector<ListNode*> stk; |
| 246 | + for (ListNode* cur = head; cur; cur = cur->next) { |
| 247 | + while (stk.size() && stk.back()->val < cur->val) { |
| 248 | + stk.pop_back(); |
| 249 | + } |
| 250 | + if (stk.size()) { |
| 251 | + stk.back()->next = cur; |
| 252 | + } else { |
| 253 | + dummy->next = cur; |
| 254 | + } |
| 255 | + stk.push_back(cur); |
| 256 | + } |
| 257 | + return dummy->next; |
| 258 | + } |
| 259 | +}; |
| 260 | +``` |
| 261 | + |
169 | 262 | ### **Go**
|
170 | 263 |
|
171 | 264 | ```go
|
@@ -199,6 +292,32 @@ func removeNodes(head *ListNode) *ListNode {
|
199 | 292 | }
|
200 | 293 | ```
|
201 | 294 |
|
| 295 | +```go |
| 296 | +/** |
| 297 | + * Definition for singly-linked list. |
| 298 | + * type ListNode struct { |
| 299 | + * Val int |
| 300 | + * Next *ListNode |
| 301 | + * } |
| 302 | + */ |
| 303 | +func removeNodes(head *ListNode) *ListNode { |
| 304 | + dummy := &ListNode{Next: head} |
| 305 | + stk := []*ListNode{} |
| 306 | + for cur := head; cur != nil; cur = cur.Next { |
| 307 | + for len(stk) > 0 && stk[len(stk)-1].Val < cur.Val { |
| 308 | + stk = stk[:len(stk)-1] |
| 309 | + } |
| 310 | + if len(stk) > 0 { |
| 311 | + stk[len(stk)-1].Next = cur |
| 312 | + } else { |
| 313 | + dummy.Next = cur |
| 314 | + } |
| 315 | + stk = append(stk, cur) |
| 316 | + } |
| 317 | + return dummy.Next |
| 318 | +} |
| 319 | +``` |
| 320 | + |
202 | 321 | ### **TypeScript**
|
203 | 322 |
|
204 | 323 | ```ts
|
@@ -236,6 +355,37 @@ function removeNodes(head: ListNode | null): ListNode | null {
|
236 | 355 | }
|
237 | 356 | ```
|
238 | 357 |
|
| 358 | +```ts |
| 359 | +/** |
| 360 | + * Definition for singly-linked list. |
| 361 | + * class ListNode { |
| 362 | + * val: number |
| 363 | + * next: ListNode | null |
| 364 | + * constructor(val?: number, next?: ListNode | null) { |
| 365 | + * this.val = (val===undefined ? 0 : val) |
| 366 | + * this.next = (next===undefined ? null : next) |
| 367 | + * } |
| 368 | + * } |
| 369 | + */ |
| 370 | + |
| 371 | +function removeNodes(head: ListNode | null): ListNode | null { |
| 372 | + const dummy = new ListNode(0, head); |
| 373 | + const stk: ListNode[] = []; |
| 374 | + for (let cur = head; cur; cur = cur.next) { |
| 375 | + while (stk.length && stk.at(-1)!.val < cur.val) { |
| 376 | + stk.pop(); |
| 377 | + } |
| 378 | + if (stk.length) { |
| 379 | + stk.at(-1)!.next = cur; |
| 380 | + } else { |
| 381 | + dummy.next = cur; |
| 382 | + } |
| 383 | + stk.push(cur); |
| 384 | + } |
| 385 | + return dummy.next; |
| 386 | +} |
| 387 | +``` |
| 388 | + |
239 | 389 | ### **...**
|
240 | 390 |
|
241 | 391 | ```
|
|
0 commit comments