Compare commits

..
4 Commits
Author SHA1 Message Date
li_chx f19f1f5e85 148. 排序链表 2026-08-13 20:57:24 +08:00
li_chx 4ee6823943 92. 反转链表 II 2026-08-12 21:58:10 +08:00
li_chx 1d785da008 2840. 判断通过操作能否让字符串相等 II 2026-03-30 08:40:34 +08:00
li_chx 51984f6f9b 7. 整数反转 2026-03-29 21:58:42 +08:00
3 changed files with 82 additions and 45 deletions
+3
View File
@@ -0,0 +1,3 @@
module lichx.top/go-test
go 1.25.0
+27
View File
@@ -0,0 +1,27 @@
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func makeLink(arr []int) *ListNode {
if len(arr) == 0 {
return nil
}
head := &ListNode{}
cur := head
for _, v := range arr {
cur.Next = &ListNode{Val: v}
cur = cur.Next
}
return head.Next
}
func checkLink(head *ListNode) {
for head != nil {
fmt.Println(head.Val)
head = head.Next
}
}
+55 -48
View File
@@ -1,55 +1,62 @@
package main package main
import "fmt" func conquerAndSort(head *ListNode, end *ListNode) *ListNode {
if head == nil || head == end || head.Next == nil {
// ListNode Definition for singly-linked list. return head
type ListNode struct { }
Val int if head.Next == end {
Next *ListNode if end != nil {
if head.Val > end.Val {
head.Val, end.Val = end.Val, head.Val
}
}
return head
}
if head.Next.Next == end {
if head.Val > head.Next.Val {
head.Next.Val, head.Val = head.Val, head.Next.Val
}
return head
}
slow, fast := head, head
for fast.Next != nil && fast.Next.Next != nil {
slow = slow.Next
fast = fast.Next.Next
}
lastSlow := slow
slow = slow.Next
lastSlow.Next = nil
a := conquerAndSort(head, nil)
b := conquerAndSort(slow, end)
if a.Val > b.Val {
a, b = b, a
}
// a Val < b Val
head = a
cur := a
a = a.Next
for a != nil && b != nil {
if a.Val > b.Val {
cur.Next = b
b = b.Next
} else {
cur.Next = a
a = a.Next
}
cur = cur.Next
}
if a == nil {
cur.Next = b
} else {
cur.Next = a
}
return head
} }
func sortList(head *ListNode) *ListNode {
func isPalindrome(head *ListNode) bool { return conquerAndSort(head, nil)
srcHead := head
head = head.Next
// var left, right *ListNode
cnt := 1
for head != nil {
head = head.Next
cnt++
}
head = srcHead.Next
lastNode := srcHead
srcHead.Next = nil
half := cnt / 2
half--
for range half {
p := head.Next
head.Next = lastNode
lastNode = head
head = p
}
if cnt&1 == 1 {
head = head.Next
}
for head != nil && lastNode != nil {
if head.Val != lastNode.Val {
return false
}
head = head.Next
lastNode = lastNode.Next
}
if head != nil || lastNode != nil {
return false
}
return true
} }
func main() { func main() {
isPalindrome := isPalindrome(&ListNode{ arr := []int{-1, 5, 3, 4, 0}
Val: 1, checkLink(sortList(makeLink(arr)))
Next: &ListNode{
Val: 2,
},
})
fmt.Printf("isPalindrome: %v\n", isPalindrome)
} }