LeetCode 补充题 1. 排序奇升偶降链表
题目描述
思路分析
- 将链表按照奇数位和偶数位分隔为两个链表
- 反转偶数位链表
- 合并两个有序链表
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 排序奇升偶降链表
func sortOddEvenList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
// 拆分奇偶链表
odd, even := head, head.Next
oddHead, evenHead := odd, even
for even != nil && even.Next != nil {
odd.Next = odd.Next.Next
odd = odd.Next
even.Next = even.Next.Next
even = even.Next
}
odd.Next = nil // 非常重要
// 反转偶数链表
var pre *ListNode
cur := evenHead
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
evenHead = pre
// 合并两个链表
dummy := &ListNode{}
cur = dummy
l1, l2 := oddHead, evenHead
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
cur.Next = l1
l1 = l1.Next
} else {
cur.Next = l2
l2 = l2.Next
}
cur = cur.Next
}
if l1 != nil {
cur.Next = l1
} else if l2 != nil {
cur.Next = l2
}
return dummy.Next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
// 排序奇升偶降链表
func sortOddEvenList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
// 拆分奇偶链表
odd, even := head, head.Next
oddHead, evenHead := odd, even
for even != nil && even.Next != nil {
odd.Next = odd.Next.Next
odd = odd.Next
even.Next = even.Next.Next
even = even.Next
}
odd.Next = nil // 非常重要
// 反转偶数链表
var pre *ListNode
cur := evenHead
for cur != nil {
next := cur.Next
cur.Next = pre
pre = cur
cur = next
}
evenHead = pre
// 合并两个链表
dummy := &ListNode{}
cur = dummy
l1, l2 := oddHead, evenHead
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
cur.Next = l1
l1 = l1.Next
} else {
cur.Next = l2
l2 = l2.Next
}
cur = cur.Next
}
if l1 != nil {
cur.Next = l1
} else if l2 != nil {
cur.Next = l2
}
return dummy.Next
}
// 打印链表
func printList(head *ListNode) {
cur := head
for cur != nil {
fmt.Print(cur.Val, " -> ")
cur = cur.Next
}
fmt.Println("NULL")
}
func main() {
// 示例链表
head := &ListNode{1, &ListNode{8, &ListNode{3, &ListNode{6, &ListNode{5, &ListNode{4, &ListNode{7, &ListNode{2, nil}}}}}}}}
fmt.Println("原链表:")
printList(head)
sortedHead := sortOddEvenList(head)
fmt.Println("排序后的链表:")
printList(sortedHead)
}
1
write your code here
相似题目
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用