Merge K Sorted Lists

来源:互联网 发布:正规淘宝兼职网站 编辑:程序博客网 时间:2024/06/13 03:01

将多个有序链表拼接成一个,思路同拼接两个链表,先比较两个(或k个)链表的表头,最小的表头节点摘下,继续比较,直到所有链表的节点都被摘空为止。基于算法的效率考虑,每次比较k个链表的表头,只有最小的表头节点被拿走,下一次拿该表头节点的下一个节点和其余k-1个比较。此时对k个节点的排序不用堆排序都对不起当年在算法课上猛打瞌睡的自己。
代码如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    ArrayList<ListNode> nodeListHeap=new ArrayList<ListNode>();    public ListNode mergeKLists(ListNode[] lists) {        ListNode node=new ListNode(0);        ListNode head=node;        if(lists==null){            return null;        }        createHeap(lists);        while(nodeListHeap.size()>1){            if(nodeListHeap.get(0)==null){                return null;            }            node.next=nodeListHeap.get(0);            node=node.next;            //此处处理的要点是截断不能破坏堆结构,使用策略用常见的堆策略,即把最后一个放到第一个位置            if(nodeListHeap.get(0).next==null){                nodeListHeap.set(0,nodeListHeap.get(nodeListHeap.size()-1));                nodeListHeap.remove(nodeListHeap.size()-1);            }else{                nodeListHeap.set(0,nodeListHeap.get(0).next);            }            adjustHeap(0);        }        if(nodeListHeap.size()==1){            node.next=nodeListHeap.get(0);        }        return head.next;    }    public void createHeap(ListNode[] lists){            for(ListNode node:lists){            if(node!=null){                nodeListHeap.add(node);            }        }        if(nodeListHeap.size()<=1){            return;        }        int index=(nodeListHeap.size()-1)/2;        while(index>=0){            int leftparent=index*2+1;            int rightparent=index*2+2;            ListNode tempNode=null;            if(rightparent<nodeListHeap.size()&&nodeListHeap.get(leftparent).val>nodeListHeap.get(rightparent).val){                if(nodeListHeap.get(index).val>nodeListHeap.get(rightparent).val){                    ListNode nodetemp=nodeListHeap.get(index);                    nodeListHeap.set(index, nodeListHeap.get(rightparent));                    nodeListHeap.set(rightparent, nodetemp);                    adjustHeap(rightparent);                }            }else if(leftparent<nodeListHeap.size()&&nodeListHeap.get(index).val>nodeListHeap.get(leftparent).val){                ListNode nodetemp=nodeListHeap.get(index);                nodeListHeap.set(index, nodeListHeap.get(leftparent));                nodeListHeap.set(leftparent, nodetemp);                adjustHeap(leftparent);             }            index--;        }    }    public void adjustHeap(int start){        int index=start;        while(index<(nodeListHeap.size()+1)/2){            int leftparent=index*2+1;            int rightparent=index*2+2;            if(rightparent<nodeListHeap.size()&&nodeListHeap.get(leftparent).val>nodeListHeap.get(rightparent).val){                if(nodeListHeap.get(index).val>nodeListHeap.get(rightparent).val){                    ListNode nodetemp=nodeListHeap.get(index);                    nodeListHeap.set(index, nodeListHeap.get(rightparent));                    nodeListHeap.set(rightparent, nodetemp);                    index=rightparent;                }else{                    return;                }            }else if(leftparent<nodeListHeap.size()){                if(nodeListHeap.get(index).val>nodeListHeap.get(leftparent).val){                    ListNode nodetemp=nodeListHeap.get(index);                    nodeListHeap.set(index, nodeListHeap.get(leftparent));                    nodeListHeap.set(leftparent, nodetemp);                    index=leftparent;                }else{                    return;                }            }else{                return;            }        }        return;    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网易新闻上的视频没有声音怎么办 把登录窗体的宏删掉了怎么办 电脑死机了怎么办也不能关机了 虎牙直播手游无法和队友开麦怎么办 为成年开无手续麽托出车祸怎么办 支付宝商户未签约或合约过期怎么办 我的手机帐号被锁定了怎么办 点错网页下载收发收费信息怎么办 用邮箱注册的微信忘记密码了怎么办 很久不用的邮箱号忘记密码怎么办 陕西省志愿云忘记密码和邮箱怎么办 国寿易学堂忘记登录密码怎么办 百度云下载显示本地空间不足怎么办 百度云离线内容违规无法下载怎么办 百度云压缩包要压解密码没有怎么办 用2016酷我音乐制作铃音怎么办 邮箱跟手机号一同绑定支付宝怎么办 网易邮箱取消账户关联没反应怎么办 剑三重置版客户端修复不成功怎么办 网易闪电邮的邮件满了怎么办 忘了手机的账号和密码怎么办 手机绑定的扣扣达到十个上限怎么办 邮箱发送邮件到上限无法发送怎么办 路由器重置后不知道账号密码怎么办 发出的邮件别人看了撤回不了怎么办 域名和邮箱是不同的公司怎么办 qq音乐听过的歌单找不到了怎么办 快手开直播前置摄像头太暗怎么办 小米手机帐号绑定无法侠用怎么办 用交易猫买完游戏账号被骗了怎么办 一个华为账号有两个游戏账号怎么办 加密u盘电脑上打开空怎么办 国网加密u盘电脑打开为空怎么办 足球竞彩软件下架后里面的钱怎么办 竞彩足球提现不到账怎么办 竞彩足球投注后输了怎么办 英雄联盟鼠标箭头右键点不了怎么办 上古卷轴5数值修改错了怎么办 小时候打针把屁股脂肪打扁了怎么办 大繁盛满腹市场2对话时闪退怎么办 月经来了一个月了还不停怎么办