题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
实现:
public class GetMedianNum {
ListNode head=new ListNode(-1);
ListNode m1=null;
ListNode m2=null;
public void Insert(Integer num) {
boolean b=false;
if(head.next==null){
b=true;
}
ListNode in=new ListNode(num);
ListNode p=head;
while(p.next!=null && p.next.val<num){
p=p.next;
}
in.next=p.next;
p.next=in;
if(b){
m1=head.next;
m2=head.next;
}
else{
if(m1==m2){//两个指针指向同一个结点
if(num>m1.val){//num插入指针后面
m1=m1.next;
}
else{//num插入指针前面
ListNode t=head;
while(t.next!=null && t.next!=m2){
t=t.next;
}
m2=t;
}
}
else{//两个指针指向不同的结点
if(num>m1.val && num>m2.val){//插入两个指针后面
m2=m2.next;
}
else{
if(num>m2.val && num<m1.val){//插入两个指针中间
m1=in;
m2=in;
}
else{//插入两个指针前面
m1=m2;
}
}
}
}
}
public Double GetMedian() {
if(head.next==null) return null;
if(m1==m2) return (double) m1.val;
else return (double) (m1.val+m2.val)/2;
}
}
public class ListNode {
public int val;
public ListNode next;
public ListNode(int val){
this.val=val;
next=null;
}
}
指针操作比较复杂,用一个链表保存输入的数据,插入时比顺序表好操作一点,指针m1和m2是指向中间的指针,以方便读取中位数,但是维护这两个指针有一点麻烦。