u
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user