合并K个排序链表 Merge K Sorted Lists

思路
分治法
,把k个链表不停的分成两份,直到其中一份为2个链表或一个链表。2个链表就把这两个链表合并,返回合并的链表。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode MergeKLists(ListNode[] lists) {
if(lists.Length==0)
{
return null;
}
return Merge(0,lists.Length-1,lists);
}
public ListNode Merge(int i,int j,ListNode[] lists){
if(i>j)
{
return null;
}
if(i==j)
{
return lists[i];
}
int mid=i+(j-i)/2;
ListNode left=Merge(i,mid,lists);
ListNode right=Merge(mid+1,j,lists);
ListNode head=new ListNode(0);
ListNode runner=head;
while(left!=null&&right!=null){
if(left.val>right.val)
{
runner.next=right;
right=right.next;
runner=runner.next;
}else{
runner.next=left;
left=left.next;
runner=runner.next;
}
}
if(left==null&&right==null)
{
return head.next;
}
if(left==null)
{
runner.next=right;
}else{
runner.next=left;
}
return head.next;
}
}
合并两个链表时,用一个结点head当做头结点,最后返回的时候就返回head.next
runner则是合并时用来指向合并的链表的最后一个结点
需注意的是,当一个链表被合并完时,另一个链表可能还有未合并的结点。所以在while语句完成后,加入了判断。未合并的结点直接接在合并链表的后面即可
