合并K个升序链表
题目:
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路一:暴力解法
可以初始化一个链表用来记录合并后的链表,然后遍历链表数组,每次将遍历到的链表与已经合并的链表进行合并。两个的链表的合并用到了,归并排序的思想。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode head=null; //用于记录合并后的链表
//依次遍历链表数组,将正在访问的链表与已经合并的链表进行合并
for(int i=0;i<lists.length;i++)
{
head=merge(head,lists[i]);
}
return head;
}
//对两个链表进行合并
public ListNode merge(ListNode node1,ListNode node2)
{
//如果一个链表为null不需要操作,返回另一个
if(node1==null||node2==null)
return node1==null? node2:node1;
//创建一个辅助头结点,用来记录合并后的链表
ListNode head=new ListNode(0);
ListNode r=head;//采用尾插法需要指针指向最后一个结点
while(node1!=null&&node2!=null)
{
ListNode s;
//将val值最小的节点找出
if(node1.val<node2.val)
{
s=node1;
node1=node1.next;
}
else
{
s=node2;
node2=node2.next;
}
//插入链表
r.next=s;
r=s;
}
//如果某个链表不为null,直接与合并后的链表相连
if(node1!=null)
{
r.next=node1;
}
if(node2!=null)
{
r.next=node2;
}
return head.next;
}
}
思路二:利用归并排序算法的思想
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution{
public ListNode mergeKLists(ListNode[] lists)
{
return MergeList(lists,0,lists.length-1);
}
//对数组进行划分
public ListNode MergeList(ListNode[] lists,int low,int high)
{
if(low==high)
return lists[low];
else if(low>high)//划分结束
return null;
int mid=(low+high)/2;
return merge(MergeList(lists,low,mid),MergeList(lists,mid+1,high));
}
//与思路一:思路相同
public ListNode merge(ListNode node1,ListNode node2)
{
if(node1==null||node2==null)
return node1==null? node2:node1;
ListNode head=new ListNode(0);
ListNode r=head;
while(node1!=null&&node2!=null)
{
ListNode s;
if(node1.val<node2.val)
{
s=node1;
node1=node1.next;
}
else
{
s=node2;
node2=node2.next;
}
r.next=s;
r=s;
}
if(node1!=null)
{
r.next=node1;
}
if(node2!=null)
{
r.next=node2;
}
return head.next;
}