跟我坚持刷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,571评论 0 6
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,792评论 0 33
  • 虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会。现在提供在线编程评...
    selfboot阅读 54,691评论 15 88
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,494评论 1 3
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,011评论 2 36