题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
实现:
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是指向中间的指针,以方便读取中位数,但是维护这两个指针有一点麻烦。