Merge k Sorted Lists
来源:互联网 发布:淘宝商品供应商 编辑:程序博客网 时间:2024/04/28 08:03
用类似归并排序的方式来实现。
先把Lists折半分成两部分,分别对左右两部分递归调用原函数,得到两个ListNode后,按照mergeTwoLists的思路,将两个有序list合并成一个有序的list。
递归的终止条件有两个,如果Lists.size()=0,返回null,如果size==1,则返回list.get(0)。
mergeTwoLists的思路,与合并两个有序数组类似,也需要额外的空间。
必须要注意的是,要首先构造新的链表头节点,最终返回的是头节点。
public ListNode mergeKLists(ArrayList<ListNode> lists) { int len = lists.size(); if(len==0){ return null; } if(len==1){ return lists.get(0); } int middle=len/2; ArrayList<ListNode> left = new ArrayList<ListNode>(); for(int i=0;i<middle;i++){ left.add(lists.get(i)); } ListNode leftList = mergeKLists(left); ArrayList<ListNode> right = new ArrayList<ListNode>(); for(int i=middle;i<len;i++){ right.add(lists.get(i)); } ListNode rightList = mergeKLists(right); return mergeTwoLists(leftList,rightList); } ListNode mergeTwoLists(ListNode l1,ListNode l2){ ListNode head = null; if(l1 == null)return l2; else if(l2 == null)return l1; else{ if(l1.val < l2.val){ head = new ListNode(l1.val); l1 = l1.next; }else{ head = new ListNode(l2.val); l2 = l2.next; } } ListNode l = head; while(l1!=null && l2!=null){ if(l1.val<l2.val){ l.next=new ListNode(l1.val); l1=l1.next; }else{ l.next=new ListNode(l2.val); l2=l2.next; } l=l.next; } while(l1!=null){ l.next=new ListNode(l1.val); l1=l1.next; l=l.next; } while(l2!=null){ l.next=new ListNode(l2.val); l2=l2.next; l=l.next; } return head; }
以上合并有序链表空间复杂度是O(N),mergeTwoLists有空间复杂度为O(1)的方法,可以参考一下。
0 0
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- kafka安装配置简介
- IN运算符的使用
- 汪成为院士的十二个问题
- ffmpeg中的sws_scale算法性能测试
- NOT运算符与<>运算符
- Merge k Sorted Lists
- Oracle中的wmsys.wm_concat
- Android中两种设置全屏的方法
- RTX反向登录异常0xffffba9e
- effective C++ 读后感(六)若不想使用编译器自动生成的函数,就该明确拒绝
- JTextArea
- C++中的内存分布
- 傻瓜翻译程序
- c 判断链表是否有环,以及环上结点数