Files
leetcode/top-100-liked/33/33_test.go
T
2026-06-21 16:31:54 +10:00

156 lines
2.6 KiB
Go

package top100liked
import (
"fmt"
"testing"
)
// https://leetcode.cn/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&envId=top-100-liked
type ListNode struct {
Val int
Next *ListNode
}
// 模拟冒泡,超时了
// func sortList(head *ListNode) *ListNode {
// if head == nil {
// return nil
// }
// if head.Next == nil {
// return head
// }
// dummy := &ListNode{Next: head}
// count := 0
// l := 0
// var p1, p2, p3 *ListNode
// for i := 0; l == 0 || l != i; i++ {
// p1, p2, p3 = dummy, dummy.Next, dummy.Next.Next
// for p3 != nil {
// if p2.Val > p3.Val {
// p1.Next = p3
// p2.Next = p3.Next
// p3.Next = p2
// p2, p3 = p3, p2
// }
// if l == 0 {
// // 首次遍历
// count++
// } else if count >= l-i {
// break
// }
// p1 = p1.Next
// p2 = p2.Next
// p3 = p3.Next
// }
// if l == 0 {
// l = count
// }
// count = 0
// }
// return dummy.Next
// }
// 归并排序
func f(head, tail *ListNode) *ListNode {
if head == nil || tail == nil || head == tail {
return head
}
if head.Next == tail {
if head.Val > tail.Val {
tail.Next = head
head.Next = nil
return tail
} else {
return head
}
}
// 找中点
slow, fast := head, head
for fast != nil && fast.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
// slow 是中点
postSlow := slow.Next
slow.Next = nil
tail.Next = nil
left := f(head, slow)
right := f(postSlow, tail)
newHead := &ListNode{}
p1, p2, p3 := left, right, newHead
for p1 != nil || p2 != nil {
if p1 == nil || (p2 != nil && p1.Val > p2.Val) {
p3.Next = p2
p3 = p3.Next
p2 = p2.Next
} else if p2 == nil || p1.Val <= p2.Val {
p3.Next = p1
p3 = p3.Next
p1 = p1.Next
}
}
return newHead.Next
}
func sortList(head *ListNode) *ListNode {
if head == nil {
return nil
}
if head.Next == nil {
return head
}
cur := head
for cur.Next != nil {
cur = cur.Next
}
return f(head, cur)
}
func Test1(t *testing.T) {
input := &ListNode{
Val: 4,
Next: &ListNode{
Val: 2,
Next: &ListNode{
Val: 1,
Next: &ListNode{
Val: 3,
Next: nil,
},
},
},
}
output := sortList(input)
for output != nil {
fmt.Print(output.Val, " ")
output = output.Next
}
}
func Test2(t *testing.T) {
input := &ListNode{
Val: -1,
Next: &ListNode{
Val: 5,
Next: &ListNode{
Val: 3,
Next: &ListNode{
Val: 4,
Next: &ListNode{
Val: 0,
Next: nil,
},
},
},
},
}
output := sortList(input)
for output != nil {
fmt.Print(output.Val, " ")
output = output.Next
}
fmt.Println()
}