1. 程式人生 > >【leetcode】23. Merge K Sorted Lists(JAVA)

【leetcode】23. Merge K Sorted Lists(JAVA)

Description:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1->1->2->3->4->4->5->6

題目連結

思路: 首先找出所有連結串列頭中起始結點值最小的,然後以這個連結串列頭所在連結串列為基準,將其他所有連結串列加進來(不分配記憶體,只修改連結串列中結點的指向)

全部程式碼:

package leetcode;

class ListNode {
	int val;
	ListNode next;

	ListNode(int x) {
		val = x;
	}
}

public class leetcode23 {
	static int a[] = {-1,-1,-1};
	static int b[]= {-2,-2,-1};
	// static int c[]= {2,6};

	static ListNode createList(int a[]) {
		if (a.length == 0)
			return null;
		ListNode phead =
new ListNode(a[0]); ListNode p = phead; for (int i = 1; i < a.length; i++) { ListNode newnode = new ListNode(a[i]); p.next = newnode; p = p.next; } p.next = null; return phead; } public static void main(String[] args) { // create lists ListNode la = createList(a); ListNode lb=
createList(b); // ListNode lc=createList(c); ListNode lists[] = { la,lb}; Solution s = new Solution(); ListNode head = s.mergeKLists(lists); ListNode p = head; if (head == null) System.out.println("the list is empty"); else { System.out.println("the whole lists:"); System.out.printf("%d", p.val); p = p.next; while (p != null) { System.out.printf("--->%d ", p.val); p = p.next; } } } } class Solution { public ListNode mergeKLists(ListNode[] lists) { //邊界檢查*********************** //沒有連結串列或者只有一個連結串列 if (lists.length == 0) return null; if (lists.length == 1) return lists[0]; //所有連結串列都是空的 int start = 0; while (start < lists.length&&lists[start]==null) start++; if (start == lists.length) return null; //邊界檢查結束********************* int i; //找到具有最小值的連結串列頭 int min=Integer.MAX_VALUE,startpos=0; for(i=0;i<lists.length;i++) { if(lists[i]!=null) { if(lists[i].val<min) { startpos=i; min=lists[i].val; } } } for (i = 0; i < lists.length; i++) { // 將剩下的連結串列依次插入 if (lists[i] == null||i==startpos) continue; // 當前連結串列為空時,直接跳過 ListNode p2 = lists[i]; ListNode pnext2 = p2.next; ListNode p1 = lists[startpos]; while (p2 != null) { while (p1.next != null && p1.next.val < p2.val) p1 = p1.next; p2.next = p1.next; p1.next = p2; p1 = p2; p2 = pnext2; if (p2 != null) pnext2 = pnext2.next; } } return lists[startpos]; } }

執行結果: 在這裡插入圖片描述