Skip to content

Commit 0f01529

Browse files
committed
feat: leetcode 328
1 parent 669a7d2 commit 0f01529

File tree

8 files changed

+147
-1
lines changed

8 files changed

+147
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<!-- TOPICS COUNT START -->
5-
<img src="https://img.shields.io/badge/-进度:348-green" alt="进度:348">
5+
<img src="https://img.shields.io/badge/-进度:349-green" alt="进度:349">
66
<!-- TOPICS COUNT END -->
77
<a href="./assets/docs/TOPICS.md"><img src="https://img.shields.io/badge/-题库目录-blue" alt="题库目录"></a>
88
<a href="./assets/docs/CATEGORIES.md"><img src="https://img.shields.io/badge/-题库分类-red" alt="题库分类"></a>

assets/data/categories.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,12 @@
391391
"path": "./problemset/delete-node-in-a-linked-list/README.md",
392392
"difficulty": "简单"
393393
},
394+
{
395+
"id": "328",
396+
"title": "奇偶链表",
397+
"path": "./problemset/odd-even-linked-list/README.md",
398+
"difficulty": "中等"
399+
},
394400
{
395401
"id": "432",
396402
"title": "全 O(1) 的数据结构",

assets/data/topics.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2579,6 +2579,16 @@
25792579
"url": "https://leetcode-cn.com/problems/count-of-range-sum/",
25802580
"path": "./problemset/count-of-range-sum/README.md"
25812581
},
2582+
{
2583+
"id": "328",
2584+
"title": {
2585+
"cn": "奇偶链表",
2586+
"en": "odd-even-linked-list"
2587+
},
2588+
"difficulty": "中等",
2589+
"url": "https://leetcode-cn.com/problems/odd-even-linked-list/",
2590+
"path": "./problemset/odd-even-linked-list/README.md"
2591+
},
25822592
{
25832593
"id": "342",
25842594
"title": {

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
| 203. [移除链表元素](../../problemset/remove-linked-list-elements/README.md) | 简单 |
7474
| 206. [反转链表](../../problemset/reverse-linked-list/README.md) | 简单 |
7575
| 237. [删除链表中的节点](../../problemset/delete-node-in-a-linked-list/README.md) | 简单 |
76+
| 328. [奇偶链表](../../problemset/odd-even-linked-list/README.md) | 中等 |
7677
| 432. [全 O(1) 的数据结构](../../problemset/all-one-data-structure/README.md) | 困难 |
7778

7879
## 滑动窗口

assets/docs/TOPICS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,8 @@
516516

517517
[327. 区间和的个数](../../problemset/count-of-range-sum/README.md)
518518

519+
[328. 奇偶链表](../../problemset/odd-even-linked-list/README.md)
520+
519521
[342. 4的幂](../../problemset/power-of-four/README.md)
520522

521523
[355. 设计推特](../../problemset/design-twitter/README.md)
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# 奇偶链表
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode-cn.com/problems/odd-even-linked-list/
6+
7+
## 题目
8+
9+
给定单链表的头节点 `head` ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
10+
11+
第一个节点的索引被认为是 **奇数** , 第二个节点的索引为 **偶数** ,以此类推。
12+
13+
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
14+
15+
你必须在 `O(1)` 的额外空间复杂度和 `O(n)` 的时间复杂度下解决这个问题。
16+
17+
### 示例
18+
19+
#### 示例 1:
20+
21+
![oddeven-linked-list](https://user-images.githubusercontent.com/54696834/165983103-1d7f9c60-e1e4-4910-9ed8-de30413ac48a.jpg)
22+
23+
```
24+
输入: head = [1,2,3,4,5]
25+
输出: [1,3,5,2,4]
26+
```
27+
28+
#### 示例 2:
29+
30+
![oddeven2-linked-list](https://user-images.githubusercontent.com/54696834/165983115-10667613-ac82-4353-a781-e21c74e67ae5.jpg)
31+
32+
```
33+
输入: head = [2,1,3,5,6,4,7]
34+
输出: [2,3,6,7,1,5,4]
35+
```
36+
37+
## 解题
38+
39+
```ts
40+
/**
41+
* 分离再拼接
42+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
43+
* @param head
44+
* @returns
45+
*/
46+
export function oddEvenList(head: ListNode | null): ListNode | null {
47+
if (!head) return null
48+
49+
let odd = head
50+
const evenRoot = head.next
51+
let even = evenRoot
52+
if (even === null || even.next === null) return head
53+
54+
let cur: ListNode | null = even.next
55+
while (cur) {
56+
odd.next = cur
57+
odd = odd.next
58+
cur = cur.next
59+
60+
if (cur) {
61+
even.next = cur
62+
even = even.next
63+
cur = cur.next
64+
}
65+
}
66+
67+
odd.next = evenRoot
68+
even.next = null
69+
return head
70+
}
71+
```
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { oddEvenList } from '.'
3+
import type { ListNode } from '~/utils/listNode'
4+
import { createListNode } from '~/utils/listNode'
5+
6+
describe('奇偶链表', () => {
7+
testCase(oddEvenList)
8+
})
9+
10+
function testCase(fn: (head: ListNode | null) => ListNode | null) {
11+
it.each([
12+
[
13+
[1, 2, 3, 4, 5],
14+
[1, 3, 5, 2, 4],
15+
],
16+
[
17+
[2, 1, 3, 5, 6, 4, 7],
18+
[2, 3, 6, 7, 1, 5, 4],
19+
],
20+
])('示例%#', (head, expected) => {
21+
expect(fn(createListNode(head))).toStrictEqual(createListNode(expected))
22+
})
23+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import type { ListNode } from '~/utils/listNode'
2+
3+
/**
4+
* 分离再拼接
5+
* @desc 时间复杂度 O(N) 空间复杂度 O(1)
6+
* @param head
7+
* @returns
8+
*/
9+
export function oddEvenList(head: ListNode | null): ListNode | null {
10+
if (!head) return null
11+
12+
let odd = head
13+
const evenRoot = head.next
14+
let even = evenRoot
15+
if (even === null || even.next === null) return head
16+
17+
let cur: ListNode | null = even.next
18+
while (cur) {
19+
odd.next = cur
20+
odd = odd.next
21+
cur = cur.next
22+
23+
if (cur) {
24+
even.next = cur
25+
even = even.next
26+
cur = cur.next
27+
}
28+
}
29+
30+
odd.next = evenRoot
31+
even.next = null
32+
return head
33+
}

0 commit comments

Comments
 (0)