1、题目
2、题解
1)看到题的第一反应是暴力求解,即将数组内的各个链表直接相连在一起,然后再对整体链表进行排序,但这样做就浪费了数组内单个链表已经升序排列的这一特点。所以想了个稍微复杂点的方法,那就是依次遍历,将第二个链表插入第一个构建新链表,再将第三个插入新链表,依次类推。总感觉应该还有更简单的办法,但先把这个方法实现看看吧。代码如下:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
var res *ListNode
if len(lists) == 0{
return res
}
if len(lists) == 1{
return lists[0]
}
for _, list := range lists{
res = orderList(res, list)
}
return res
}
func orderList(l1, l2 *ListNode) (r *ListNode) {
var m, s *ListNode
if l1 == nil{
r = l2
return
}
if l2 == nil{
r = l1
return
}
if l1.Val<=l2.Val{
m = l1
s = l2
}else{
m = l2
s = l1
}
r = m
for ; s!=nil; {
tmp1 := m
for ;s.Val>=m.Val; {
if m.Next == nil {
m.Next = s
return
}
tmp1 = m
m = m.Next
}
// s插入m之前的位置
// fmt.Println(strconv.Itoa(tmp1.Val)+" "+strconv.Itoa(s.Val)+""+strconv.Itoa(m.Val))
tmp2 := s.Next
tmp1.Next = s
s.Next = m
m = s
s = tmp2
}
return
}
提交结果
2)时间晚了,不想学了,后续想要看看题解有没有简便方法