【leetcode】23. Merge K Sorted Lists(JAVA)
阿新 • • 發佈:2018-12-16
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];
}
}
執行結果: