算法题

第一题:逆波兰表达式

来源https://blog.csdn.net/qq_36237037/article/details/106629009


第二题.题目描述

来源https://blog.csdn.net/qq_36237037/article/details/106644664

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

一 思路一 最笨方法

将所有节点添加到一个数组中 

对数组中的节点从小到大进行排序

从数组中从小到大依次取出节点,串成链表

二 思路二 逐一比较

第一步:找到所有链表中的最小的一个结点

把这个结点赋值给创建的链表的head,然后再把最小的链表的下一个结点赋值给这个链表,然后有一个while循环,直到所有链表 不满足条件,不赋值为止,跳出循环。

/// 方法二 逐一比较

- (LinkNode *)mergeManyLists2:(NSMutableArray *)linkNodes {

    if (linkNodes == nil || linkNodes.count == 0) {

        return nil;

    }

    LinkNode *head = [[LinkNode alloc] init];

    LinkNode *cur = head;

    while (true) {

        int minIndex = -1;

        for (int i = 0; i < linkNodes.count; i++) {

            if (linkNodes[i] == nil || linkNodes[i].element == nil) {

                continue;

            }

            if (minIndex == -1 || linkNodes[i].value < linkNodes[minIndex].value) {

                minIndex = i;

            }

        }

        if (minIndex  == -1) {

            break;

        }

        cur = cur.next = linkNodes[minIndex];

        linkNodes[minIndex] = linkNodes[minIndex].next;

    }

    return head.next;

}

方法三递归有点问题应该使用



因为递归的时间复杂度是2的n次方,上面的方式是kn

第一种时间复杂度是O(nlogn)

空间复杂度是:O(n)

第二种时间复杂度是O(kn)

第三种时间复杂度是:O(kn)

第四种时间复杂度是:O(nLogk)

空间复杂度是O(k)

第五种时间复杂度是O(nlogk)

你可能感兴趣的:(算法题)