程序员坚持LeetCode

跟我坚持刷leetcode(第三天-k个链表的归并)

2017-04-04  本文已影响124人  北极星光熊

对抗惰性,从今天做起。坚持每天刷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];
}
上一篇 下一篇

猜你喜欢

热点阅读