栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构链表学习Day?--合并K个升序链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构链表学习Day?--合并K个升序链表

23. 合并K个升序链表

我觉得这个题最好的做法是用分治法:
过程:

将整个链表合并可以分解成:
1.将数组的左半边合并。
2.将数组的右半边合并。
3.最终将数组的左右两边合并。

其中需要掌握将两个有序递增链表合并的知识。

class Solution {
public:
	//3.合并两个有序递增链表的逻辑 (相当于最后一步将左右半边合并)
    ListNode* mergeTwoLists(ListNode *a, ListNode *b) {
        if ((!a) || (!b)) return a ? a : b;
        ListNode head, *tail = &head, *aPtr = a, *bPtr = b;
        while (aPtr && bPtr) {
            if (aPtr->val < bPtr->val) {
                tail->next = aPtr; aPtr = aPtr->next;
            } else {
                tail->next = bPtr; bPtr = bPtr->next;
            }
            tail = tail->next;
        }
        if(aPtr){
        	tail->next=aPtr;
        }
        else{
        	tail->next=bPtr;
        }
        return head.next;
    }
	//2、将整个数组的左半边、右半边分别合并。
    ListNode* merge(vector  &lists, int l, int r) {
        if (l == r) return lists[l];
        if (l > r) return nullptr;
        int mid = (l + r) / 2;
        return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
    }
	//1、起始函数:
    ListNode* mergeKLists(vector& lists) {
        return merge(lists, 0, lists.size() - 1);
    }
};

注意用分治法的时候函数的定义,一般都是这种借助递归来实现大规模问题小规模化。

    ListNode* mergeKLists(vector& lists) {
        return merge(lists, 0, lists.size() - 1);
    }

分治法的复杂度的求解也很重要

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/714533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号