在两个有序链表中查找第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.
解答:
其实我们可以借鉴合并有序链表的方法来解决这个问题。
算法实现如下:
题目描述:
即在两个有序链表中查找第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; }
相关文章推荐
- 在两个有序链表中查找第K大元素。
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 两个有序数组中查找第K大数
- 两个有序非重数组,如果查找数组之间的重复元素
- 查找两个已经排好序的数组的第k大的元素
- 查找两个已经排好序的数组的第k大的元素
- Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值
- 求两个有序数组的第k小元素
- 查找两个已经排好序的数组的第k大的元素
- 求两个有序数组的中位数或者第k小元素(转载)
- 面试题41:有序数组,查找和为s的两个元素and 和为s的连续数字
- 链表的创建、元素插入、元素删除、以及两个有序链表的归并
- leetcode—从两个有序数组中寻找他们并集的第k小元素(思路)
- 从两个有序数组的并集中寻找第k小元素
- 将两个数组中的元素有序存入到一个链表中(C语言)
- 【leetcode】——从两个有序数组中寻找他们并集的第k小元素
- 求两个有序数组的中位数和者第k小元素
- 两个有序数组中找中位数或者第K大的元素
- 【极难】【二分查找】返回两个数组中第k小的元素
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做