1.题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
2.代码:
- 归并:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
对指针数组进行归并,当两组为(1,0)、(1,1)、(0,1)时进行merge(),merge反回一个合并数组,与之后数组进行merge()
*/
typedef struct ListNode * head;
struct ListNode* mergeTwoLists(struct ListNode* l1,struct ListNode* l2){
if(!l1)
return l2;
if(!l2)
return l1;
struct ListNode *head=(struct ListNode* )malloc(sizeof(struct ListNode));
struct ListNode *p1=l1,*p2=l2,*t=head;
head->next=NULL;
t->next=NULL;
while(p1&&p2){
if(p1->val<=p2->val){
t->next=p1;
t=p1;
p1=p1->next;
}
else{
t->next=p2;
t=p2;
p2=p2->next;
}
}
if(p1)
t->next=p1;
else
t->next=p2;
return head->next;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
if(listsSize==0)
return NULL;
if(listsSize==1)
return lists[0];
int mid=listsSize/2;
struct ListNode** l1=(struct ListNode** )malloc(sizeof(struct ListNode*)*mid);
struct ListNode** l2=(struct ListNode** )malloc(sizeof(struct ListNode*)*(listsSize-mid));
for(int i=0;i<mid;i++)
l1[i]=lists[i];
for(int i=mid,j=0;i<listsSize;i++,j++)
l2[j]=lists[i];
struct ListNode* m1=mergeKLists(l1,mid);
struct ListNode* m2=mergeKLists(l2,listsSize-mid);
return mergeTwoLists(m1,m2);
}
- 堆排序
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
if not lists:
return
heap = []
for node in lists:
while node:
heapq.heappush(heap,node.val)
node = node.next
p = ListNode(-1)
s = p
while heap:
s.next = ListNode(heapq.heappop(heap))
s = s.next
return p.next