ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

23. 合并K个排序链表

2020-01-11 12:55:21  阅读:253  来源: 互联网

标签:return newLength int 23 lists 链表 newLists length 排序


23. 合并K个排序链表

https://leetcode-cn.com/problems/merge-k-sorted-lists/

难度 完成日期 耗时 提交次数
困难 2020-1-11 1小时 5

问题描述

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

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解题思路

普通方法

ListNode *mergeKLists(vector<ListNode *> &lists) {
    int length = lists.size();
    if (length == 2) {
        return mergeTwoLists(lists[0], lists[1]);
    } else {
        int newLength = length / 2;
        if (length % 2 == 1) {
            newLength++;
        }
        vector<ListNode *> newLists(newLength);
        for (int i = 0; i < newLength - 1; i++) {
            newLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
        }
        if (length % 2 == 1) {
            newLists[newLength - 1] = lists[2 * newLength - 2];
        }
        return mergeKLists(newLists);
    }
}

对所有链表两两分组,依次执行二路归并,再将所有结果收集起来,建立一个新的向量,递归地执行方法。本地执行成功,提交代码后出现栈溢出的错误。

AddressSanitizer:DEADLYSIGNAL
=================================================================
==29==ERROR: AddressSanitizer: stack-overflow on address 0x7ffc216d7ff8 (pc 0x00000040b6c4 bp 0x7ffc216d8170 sp 0x7ffc216d8000 T0)
==29==ABORTING

栈溢出

ListNode *mergeKLists(vector<ListNode *> &lists) {
    int length = lists.size();
    if (length == 0) {
        return nullptr;
    } else if (length == 1) {
        return lists[0];
    } else if (length == 2) {
        return mergeTwoLists(lists[0], lists[1]);
    } else {
        int newLength = length / 2;
        if (length % 2 == 1) {
            newLength++;
        }
        vector<ListNode *> newLists(newLength);
        for (int i = 0; i < newLength - 1; i++) {
            newLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
        }
        if (length % 2 == 1) {
            newLists[newLength - 1] = lists[2 * newLength - 2];
        }
        return mergeKLists(newLists);
    }
}

解决向量长度为 0 或 1 时无限递归问题。

判断循环次数

ListNode *mergeKLists(vector<ListNode *> &lists) {
    int length = lists.size();
    if (length == 0) {
        return nullptr;
    } else if (length == 1) {
        return lists[0];
    } else if (length == 2) {
        return mergeTwoLists(lists[0], lists[1]);
    } else {
        int newLength = length / 2;
        if (length % 2 == 1) {
            newLength++;
            vector<ListNode *> newLists(newLength);
            for (int i = 0; i < newLength - 1; i++) {
                newLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
            }
            newLists[newLength - 1] = lists[2 * newLength - 2];
            return mergeKLists(newLists);
        } else {
            vector<ListNode *> newLists(newLength);
            for (int i = 0; i < newLength; i++) {
                newLists[i] = mergeTwoLists(lists[2 * i], lists[2 * i + 1]);
            }
            return mergeKLists(newLists);
        }
    }
}

分组后是否产生余数对循环次数有不同的影响。

标签:return,newLength,int,23,lists,链表,newLists,length,排序
来源: https://www.cnblogs.com/kennyoooo/p/12179578.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有