跟我堅持刷leetcode(第三天-k個鏈表的歸并)

對抗惰性,從今天做起。堅持每天刷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];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • //leetcode中還有花樣鏈表題,這里幾個例子,冰山一角 求單鏈表中結點的個數----時間復雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,533評論 0 6
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,769評論 0 33
  • 雖然刷題一直飽受詬病,不過不可否認刷題確實能鍛煉我們的編程能力,相信每個認真刷題的人都會有體會?,F在提供在線編程評...
    selfboot閱讀 52,906評論 15 88
  • 大學的時候不好好學習,老師在講臺上講課,自己在以為老師看不到的座位看小說,現在用到了老師講的知識,只能自己看書查資...
    和玨貓閱讀 1,475評論 1 3
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,920評論 2 36