面试题:找出n个降序链表中的第k大的值

面试题:找出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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值