1. 程式人生 > >leetcode 23. 合併K個排序連結串列 C#

leetcode 23. 合併K個排序連結串列 C#

合併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語句完成後,加入了判斷。未合併的結點直接接在合併連結串列的後面即可

通過截圖