對抗惰性,從今天做起。堅持每天刷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];
}