对抗惰性,从今天做起。坚持每天刷leetcode并附带一个题的题目,思路,代码。感兴趣的小伙伴一起坚持来吧(c代码,不过思路都是差不多的)。
题目(难度困难):
将k个排好序的链表归并成一个链表。
函数定义为:
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize);
思路:
1.其实想要做出来题目的话,简单难度而已,只要你会两个链表的归并。最简单的方法,第一个和第二个合并后,再和第三个合并,依次循环。我的Accepted用的是这个方法,但是只打败了百分之40多的提交者。
2.稍微进阶一些的想法就是用归并排序的思想,不断两两归并,最后合成一个大的链表。
3.做完这道题之后,顺便在博客上找了一下其他人的想法,有说用最小堆实现的,本人没有实践过,感兴趣的可以尝试一下。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
struct ListNode* merge(struct ListNode* a,struct ListNode* b)
{
struct ListNode* head = malloc(sizeof(struct ListNode));
struct ListNode* c = head;
while((a!=NULL)&&(b!=NULL))
{
if((a->val)<(b->val))
{
c->next = a;
c = c->next;
a = a->next;
}
else
{
c->next = b;
c = c->next;
b = b->next;
}
}
if(a==NULL)
c->next = b;
else
c->next = a;
return head->next;
}
int i = 0;
for(i=1;i<listsSize;i++)
{
lists[0] = merge(lists[0],lists[i]);
}
return lists[0];
}