力扣23题,合并K个升序链表
力扣23题,合并K个升序链表
题目描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
输入输出样例
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
输入:lists = [] 输出:[]
输入:lists = [[]] 输出:[]
解法一,(顺序合并)
//合并k个升序链表 ListNode *mergeKLists(vector<ListNode*>&lists) { ListNode* resList; int length=lists.size(); if(length==0) { return resList=nullptr; } else if(length==1) { resList=lists[0]; return resList; } resList=lists[0]; //设置标志位 for(int i=1;i<length;i++) { resList=mergeList(resList,lists[i]); } // resList=mergeList(lists[0],lists[1]); // cout<<"合并后的list元素: "; // printList(resList->next); return resList; } ListNode *mergeList(ListNode *list1,ListNode *list2) { if(list1==nullptr) { return list2; } else if(list2==nullptr) { return list1; } else if(list1->val<list2->val) { list1->next=mergeList(list1->next,list2); return list1; } else { list2->next=mergeList(list1,list2->next); return list2; } }
采用leetcode23题中的方法,首先对两个链表进行递归合并,然后在推广到三个,四个以及多个链表的合并。
解法二:使用分治算法
ListNode *mergeKList2(vector<ListNode*>&lists) { int length=lists.size(); ListNode* resList; if(length==0) { return resList=nullptr; } else if(length==1) { resList=lists[0]; return resList; } int interval=1; while(interval<length) { for(int i=0;i<length-interval;i=i+2*interval) { lists[i]=mergeList(lists[i],lists[i+interval]); } interval*=2; } return lists[0]; }
分治算法相较于顺序合并就是一个逐次进行两两匹配的过程。
下一篇:
java读取Excel文件指定列的数据