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() }