
public class MergeSortedLink {
//递归
public static ListNode merge(ListNode head1,ListNode head2){
ListNode mergedHead;
if(head1 == null){
return head2;
}
if(head2 == null){
return head1;
}
if(head1.data < head2.data){
mergedHead = head1;
mergedHead.next = merge(head1.next,head2);
}else {
mergedHead = head2;
mergedHead.next = merge(head1,head2.next);
}
return mergedHead;
}
//非递归
public static ListNode merge1(ListNode head1,ListNode head2){
ListNode temp = new ListNode(0);
ListNode tail = temp;
while (true){
if(head1 == null){
tail.next = head2;
break;
}
if(head2 == null){
tail.next = head1;
break;
}
if(head1.data <= head2.data){
tail.next = head1;
head1 = head1.next;
}else {
tail.next = head2;
head2 = head2.next;
}
tail = tail.next;
}
return temp.next;
}
//合并k个有序链表
public static ListNode mergeK(ListNode[] listNodes,int last){
while (last != 0){
int i = 0;
int j = last;
while (i < j){
listNodes[i] = merge1(listNodes[i],listNodes[j]);
i++;
j--;
if(i >= j){
last = j;
}
}
}
return listNodes[0];
}
//优先队列(最小堆)时间复杂度:O(nklogk)
public static ListNode mergeK1(ListNode[] listNodes,int last){
ListNode head = null;
ListNode tail = null;
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(new Comparator<ListNode>(){
public int compare(ListNode a, ListNode b)
{
return a.data-b.data;
}
});
for (int i = 0; i <= last; i++)
pq.add(listNodes[i]);
while (!pq.isEmpty())
{
ListNode top = pq.peek();
pq.remove();
if (top.next != null)
pq.add(top.next);
if (head == null)
{
head = top;
tail = top;
}
else
{
tail.next = top;
tail = top;
}
}
// head node of the required merged list
return head;
}
public static void main(String[] args){
Link link1 = new Link();
Link link2 = new Link();
link1.add(1);
link1.add(3);
link1.add(5);
link2.add(2);
link2.add(4);
link2.add(6);
link2.add(7);
ListNode newHead = MergeSortedLink.merge(link1.head,link2.head);
Link link3 = new Link();
link3.head = newHead;
link3.print();
}
}
近期评论