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 mergeKLists(lists []*ListNode) *ListNode { // if lists == nil { // return nil // } // dummy := &ListNode{} // p := dummy // var minValue int // minIndex := -1 // for { // for i := range lists { // if lists[i] != nil { // if minIndex == -1 { // minValue = lists[i].Val // minIndex = i // } // if lists[i].Val < minValue { // minValue = lists[i].Val // minIndex = i // } // } // } // if minIndex == -1 { // return nil // } // p.Next = lists[minIndex] // p = p.Next // lists[minIndex] = lists[minIndex].Next // minIndex = -1 // allNil := true // for i := range lists { // if lists[i] != nil { // allNil = false // break // } // } // if allNil { // break // } // } // return dummy.Next // } func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { p1, p2 := list1, list2 p := &ListNode{} res := p for p1 != nil && p2 != nil { if p1.Val <= p2.Val { p.Next = p1 p = p.Next p1 = p1.Next } else { p.Next = p2 p = p.Next p2 = p2.Next } } for p1 != nil { p.Next = p1 p = p.Next p1 = p1.Next } for p2 != nil { p.Next = p2 p = p.Next p2 = p2.Next } return res.Next } // 分治归并 func mergeKLists(lists []*ListNode) *ListNode { if len(lists) == 0 || lists == nil { return nil } if len(lists) == 1 { return lists[0] } l := []*ListNode{} for i := range len(lists) / 2 { l = append(l, mergeTwoLists(lists[2*i], lists[2*i+1])) } if len(lists)%2 != 0 { l = append(l, lists[len(lists)-1]) } return mergeKLists(l) } func Test1(t *testing.T) { input := []*ListNode{ { Val: 1, Next: &ListNode{ Val: 4, Next: &ListNode{ Val: 5, Next: nil, }, }, }, { Val: 1, Next: &ListNode{ Val: 3, Next: &ListNode{ Val: 4, Next: nil, }, }, }, { Val: 2, Next: &ListNode{ Val: 6, Next: nil, }, }, } output := mergeKLists(input) for output != nil { fmt.Print(output.Val, " ") output = output.Next } } func Test2(t *testing.T) { mergeKLists(nil) } func Test3(t *testing.T) { mergeKLists([]*ListNode{nil}) }