这是一次面试的时候,别人问我的,当时回答的不太好。
题目描述:
即在两个有序链表中查找第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;
- }