摘要:本文主要向大家介绍了如何用JAVA语言合并K个有序链表实现方法,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了如何用JAVA语言合并K个有序链表实现方法,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
合并K个有序链表
思路:将K个有序链表的首节点放入堆中,并且维护最小堆的性质,然后依次拿走堆顶的元素,每拿走堆顶的元素,是新放一个元素到堆顶 还是将堆的最尾端的元素置换到堆顶,取决于,拿走的元素是否有下一个节点,并且每改变一次堆,就要维护堆,这样,直到堆为空为止
Java实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
//边界判断 异常判断
if(lists==null||lists.length==0) return null;
//用List实现堆 索引0不放元素 index的左孩子为2*index 右孩子为2*index+1
List<listnode> heap=new ArrayList<>();
ListNode head=null;
ListNode s=null;
heap.add(null);
//先将K个链表的第一个节点放入堆中 堆得大小≤k 因为如果有null 则不放进去
for(int i=0;i<lists.length;i++) i="(heap.size()-1)/2;i" int="" n="">=1;i--)
protectedHeap(heap,i);
//每次从堆顶拿走最小的节点
//如果这个节点的下一个节点为null 如果这个节点的下一个节点不为null 该怎么办?自行脑补,我打字很难表达
//维护堆得性质
while(heap.size()>1){
ListNode temp=heap.get(1);
if(temp.next==null){
heap.set(1,heap.get(heap.size()-1));
heap.remove(heap.size()-1);
}else{
heap.set(1,temp.next);
}
protectedHeap(heap,1);
if(head==null){
head=temp;
s=head;
}else{
s.next=temp;
s=s.next;
}
s.next=null;
}
return head;
}
//维护堆得性质 方法如下
public void protectedHeap(List<listnode> heap,int index){
if(2*index>=heap.size()) return ;
if(2*index+1>=heap.size()){
if(heap.get(2*index).val>=heap.get(index).val)
return;
else{
ListNode temp=heap.get(2*index);
heap.set(2*index,heap.get(index));
heap.set(index,temp);
protectedHeap(heap,2*index);
}
}else{
int temp=heap.get(2*index).val<heap.get(2*index+1).val?2*index:2*index+1; listnode="" node="heap.get(temp);" pre=""><link href="https://csdnimg.cn/release/phoenix/production/markdown_views-68a8aad09e.css" rel="stylesheet">
</heap.get(2*index+1).val?2*index:2*index+1;></listnode></lists.length;i++)></listnode>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号