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

这是一次面试的时候,别人问我的,当时回答的不太好。

 

题目描述:

 

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

 

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

 

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

 

解答:

 

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

 

 

算法实现如下:

 

  1. struct node{    
  2.     int data;    
  3.     node* next;    
  4. };    
  5. typedef node* List;    
  6. int findKthElement(List &list1, List &list2, int k)    
  7. {    
  8.     List pList1 = list1;    
  9.     List pList2 = list2;    
  10.     List pCurNode = NULL;  
  11.     int count = 0;  
  12.     while(pList1 && pList2)    
  13.     {    
  14.         if (pList1->data < pList2->data)    
  15.         {      
  16.             pCurNode = pList1;    
  17.             pList1 = pList1->next;    
  18.             count++;  
  19.         }    
  20.         else if (pList1->data > pList2->data)  
  21.         {    
  22.             pCurNode = pList2;    
  23.             pList2 = pList2->next;    
  24.             count++;  
  25.         }   
  26.         else  
  27.         {  
  28.             count++;  
  29.             pCurNode = pList1;  
  30.             int temp = pList1->data;  
  31.             List p = pList1->next;  
  32.             while(p)  
  33.             {  
  34.                 if (p->data != temp)  
  35.                 {  
  36.                     pList1 = p;  
  37.                     break;  
  38.                 }  
  39.                 p = p->next;  
  40.             }  
  41.             p = pList2->next;  
  42.             while(p)  
  43.             {  
  44.                 if (p->data != temp)  
  45.                 {     
  46.                     pList2 = p;  
  47.                 }  
  48.                 p = p->next;  
  49.             }  
  50.         }  
  51.     
  52.         if (count == k)  
  53.         {  
  54.             return pCurNode->data;  
  55.         }  
  56.     }    
  57.     if (pList1 == NULL && pList2 == NULL)  
  58.     {  
  59.         return -1;  
  60.     }  
  61.     List rest = (pList1 != NULL) ? pList1 : pList2;  
  62.     while(rest)  
  63.     {  
  64.         count++;  
  65.         if (count == k)  
  66.         {  
  67.             return rest->data;  
  68.         }  
  69.         rest = rest->next;  
  70.     }  
  71.     return  -1;  
  72. }   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值