LeetCode 剑指 Offer II 排序 专题总结,25岁成功入职阿里P7的小哥哥告诉你

class Solution {

public:

int findKthLargest(vector& nums, int k) {

// 第k大就是第nums.size() - k + 1 小;

// 小到大排序

priority_queue<int, vector, less> pq;

int n = nums.size() - k + 1;

for(int i : nums) {

pq.emplace(i);

if(pq.size() > n) pq.pop();

}

return pq.top();

}

};

077. 链表排序

=========================================================================

题目:

给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

示例:

在这里插入图片描述

输入:head = [4,2,1,3]

输出:[1,2,3,4]

提示:

  • 链表中节点的数目在范围 [0, 5 * 104] 内

  • -105 <= Node.val <= 105

进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

思路:

归并思想:找中点 + 递归成单个链表节点 + 合并链表

找中点时记得将中点的前一个与后面断开

class Solution {

public:

// 找中点 + 递归成单个链表节点 + 合并链表

ListNode* sortList(ListNode* head) {

// 到只剩一个元素返回

if(head == nullptr || head->next == nullptr)

return head;

// 数组分成两段并返回中点

ListNode* head1 = head;

ListNode* head2 = serachMid(head);

head1 = sortList(head1);

head2 = sortList(head2);

// 合并并返回

return merge(head1,head2);

}

// 找中点

ListNode* serachMid(ListNode* head) {

ListNode *slow = head, *fast = head;

while(fast->next && fast->next->next) {

slow = slow->next;

fast = fast->next->next;

}

ListNode* mid = slow->next;

slow->next = nullptr;

return mid;

}

// 合并链表

ListNode* merge(ListNode* head1, ListNode* head2) {

ListNode* dummy = new ListNode(-1);

ListNode* cur = dummy;

while(head1 && head2) {

if(head1->val <= head2->val) {

cur->next = head1;

head1 = head1->next;

}else {

cur->next = head2;

head2 = head2->next;

}

cur = cur->next;

}

if(head1) cur->next = head1;

if(head2) cur->next = head2;

return dummy->next;

}

};

078. 合并排序链表(困难)

===============================================================================

题目:

给定一个链表数组,每个链表都已经按升序排列。

请将所有链表合并到一个升序链表中,返回合并后的链表。

示例:

输入:lists = [[1,4,5],[1,3,4],[2,6]]

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

解释:链表数组如下:

[

1->4->5,

1->3->4,

2->6

]

将它们合并到一个有序链表中得到。

1->1->2->3->4->4->5->6

提示:

  • k == lists.length

  • 0 <= k <= 10^4

  • 0 <= lists[i].length <= 500

  • -10^4 <= lists[i][j] <= 10^4

  • lists[i] 按 升序 排列

  • lists[i].length 的总和不超过 10^4

思路:

优先队列(小根堆)的两个思路:

首先我用的方法一,然后一直报堆栈溢出错误,后来用的方法二,然后发现方法一是可能会发生循环

解决:在加入堆后,将本节点的next节点去掉

  • 方法一:先将所有节点入队列(需重写优先队列的排序方法),然后遍历队列将所有节点连接起来
也可以将节点值直接加入队列(不需要重写排序方法),但是连接节点时需要重新创建节点

方法一、小根堆 + 全部入堆

class Solution {

public:

// 小根堆 + 全部入堆

ListNode* mergeKLists(vector<ListNode*>& lists) {

auto cmp = [&](ListNode* node1, ListNode* node2){

return node1->val > node2->val;

};

priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq(cmp);

ListNode* dummy = new ListNode(-1);

ListNode* ans = dummy;

for(auto& head : lists) {

ListNode* cur = head;

while(cur) {

pq.emplace(cur);

// 加入后将后节点去掉 不然可能循环

ListNode* pre = cur;

cur = cur->next;

pre->next = nullptr;

}

}

while(!pq.empty()) {

ListNode* node = pq.top();

pq.pop();

cout << node->val << endl;

ans->next = node;

ans = ans->next;

}

return dummy->next;

}

};

方法二、小根堆 + 加入子链表头结点

class Solution {

public:

// 小根堆 + 子链表头结点先入堆

ListNode* mergeKLists(vector<ListNode*>& lists) {

auto cmp = [&](ListNode* node1, ListNode* node2){

return node1->val > node2->val;

};

priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq(cmp);

for(auto& head : lists) {

// 记得头指针不能为空

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)
img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

,可以添加V:vip1024b 备注Java获取(资料价值较高,非无偿)**
[外链图片转存中…(img-VtvlmFHn-1711568995590)]

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

[外链图片转存中…(img-V9VA4kKR-1711568995590)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-BWZY22OV-1711568995591)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-OrfLNLqL-1711568995591)]

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值