合并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语句完成后,加入了判断。未合并的结点直接接在合并链表的后面即可