面试题:找出n个降序链表中的第k大的值
题目描述:给定n个链表,每个链表中的元素都分别是降序排列的,找出n个链表所包含的所有数中的第k大的值。
示例:给定3个降序链表,找出第4大的值。
9 -> 6 -> 2
10 -> 3 -> 2 -> 1
5 -> 1
要找的第4大的值应该为5。
思路:利用C++的优先队列,其为大根堆的实现。优先队列存储链表结点,同时需要自定义比较方法。将每个链表的头结点都入堆,结点元素最大的结点会位于堆顶。弹出该结点,并且若该结点还有下一个结点,也将其入堆。这样,弹出的第k个结点元素,即为所需要的答案。
实现:
class ListNode{
public:
int val;
ListNode *next;
ListNode(int _val, ListNode* _next): val(_val), next(_next) {}
};
struct cmp{//自定义cmp结构体
bool operator()(ListNode* a, ListNode* b) {
return a->val > b->val;
}
};
int KthNumber(vector<ListNode*>& arr, int k){
priority_queue<ListNode *, vector<ListNode *>, cmp> q;
for(ListNode* tmp : arr){//所有链表首元素入堆
q.push(tmp);
}
while(--k){//先减,这样最后需要的结果会留在堆顶
ListNode *tmp = q.top();
q.pop();
if(tmp->next != NULL){
q.push(tmp);
}
}
return q.top()->val;
}
测试:
int main(){
vector<ListNode*> arr = vector<ListNode*>(3);
arr[0] = new ListNode(9, new ListNode(6, new ListNode(2, NULL)));
arr[1] = new ListNode(10, new ListNode(3, new ListNode(2, new ListNode(1, NULL))));
arr[2] = new ListNode(5, new ListNode(1, NULL));
cout << KthNumber(arr, 4) << endl;
return 0;
}
运行,输出结果为5