leetcode 23. 合併K個排序連結串列 C#
阿新 • • 發佈:2018-12-09
合併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語句完成後,加入了判斷。未合併的結點直接接在合併連結串列的後面即可