您的位置:首页 > 其它

在两个有序链表中查找第K大元素。

2009-08-21 15:07 495 查看
这是一次面试的时候,别人问我的,当时回答的不太好。



题目描述:



即在两个有序链表中查找第k大的元素,相等的元素做一个元素处理。



{1,3,5}, {2,4,6},这是简单的情况,查找第2大的元素则是 2。



{1,3, 3,3, 5},{2,3,3,4,6},稍微复杂,查找第3大元素则是3,第4大元素 则是4.



解答:



其实我们可以借鉴合并有序链表的方法来解决这个问题。





算法实现如下:



struct node{  
    int data;  
    node* next;  
};  
typedef node* List;  
int findKthElement(List &list1, List &list2, int k)  
{  
    List pList1 = list1;  
    List pList2 = list2;  
    List pCurNode = NULL;
    int count = 0;
    while(pList1 && pList2)  
    {  
        if (pList1->data < pList2->data)  
        {    
            pCurNode = pList1;  
            pList1 = pList1->next;  
            count++;
        }  
        else if (pList1->data > pList2->data)
        {  
            pCurNode = pList2;  
            pList2 = pList2->next;  
            count++;
        } 
        else
        {
            count++;
            pCurNode = pList1;
            int temp = pList1->data;
            List p = pList1->next;
            while(p)
            {
                if (p->data != temp)
                {
                    pList1 = p;
                    break;
                }
                p = p->next;
            }
            p = pList2->next;
            while(p)
            {
                if (p->data != temp)
                {   
                    pList2 = p;
                }
                p = p->next;
            }
        }
  
        if (count == k)
        {
            return pCurNode->data;
        }
    }  
    if (pList1 == NULL && pList2 == NULL)
    {
        return -1;
    }
    List rest = (pList1 != NULL) ? pList1 : pList2;
    while(rest)
    {
        count++;
        if (count == k)
        {
            return rest->data;
        }
        rest = rest->next;
    }
    return  -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐