时间复杂度:O(n logn)
解题思路
二分思想,转化为“21.合并两个有序链表”。
21题题解可以参考我之前写的
LeetCode0021.合并两个有序链表 Go语言AC笔记https://blog.csdn.net/Hexa_H/article/details/127278986该题要求合并K个,无非就是不断递归二分,直至数组里只有两个链表,这是对这两个链表进行合并,然后返回一个新链表。
最后返回的那个链表就是合并K个有序链表后的链表。
需要注意的是,如果链表数组没有元素,那么就返回一个空指针,如果有一个元素,那么就返回该链表。
AC代码
合并两个有序链表用的是迭代法,也可以写成递归的方式,代码更简略一些。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists)==0{
return nil
}
if len(lists)==1{
return lists[0]
}
mid:=len(lists)>>1
head1:=mergeKLists(lists[:mid])
head2:=mergeKLists(lists[mid:])
return merge2Lists(head1,head2)
}
func merge2Lists(head1,head2 *ListNode)*ListNode{
res:=&ListNode{0,nil}
p:=res
for head1!=nil&&head2!=nil{
if head1.Val<head2.Val{
p.Next=head1
head1=head1.Next
}else{
p.Next=head2
head2=head2.Next
}
p=p.Next
}
if head1==nil{
p.Next=head2
}
if head2==nil{
p.Next=head1
}
return res.Next
}
感悟
昨晚21题又做的这道题,一开始想的是按顺序合并两个链表,看了题解才想到可以用“分而治之”的思想不断二分数组然后合并链表。