題目:
合並 k 個排序鏈表,返回合並后的排序鏈表。請分析和描述算法的復雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
看到這道題,能想起來昨天我寫的有一篇和這個題有些類似的博客,【合並兩個有序的鏈表】
因此這個題的思路就是
1.k個有序的鏈表,根據我們之前做的那道題,應該采用兩兩合並,也就是累加法,最后合並到一起去
2.兩個鏈表的長度可能不一樣,我們需要考慮補全的問題。
代碼如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { ListNode res = new ListNode(0); //設置結果 if(lists == null || lists.length < 0){ return null; }else if(lists.length == 1){ return lists[0]; }else if(lists.length == 2){ mergeTwoLists(lists[0],lists[1]); }else{ res = mergeTwoLists(lists[0],lists[1]); for(int i = 2; i < lists.length;i++){ mergeTwoLists(res,lists[i]); } } return res; } public ListNode mergeTwoLists(ListNode l1,ListNode l2){ ListNode res = new ListNode(0); ListNode tmp = res; while(l1 != null && l2 != null){ if(l1.val < l2.val){ tmp.next = l1; l1 = l1.next; }else{ tmp.next = l2; l2 = l2.next; } tmp = tmp.next; } //后面是為了補全的,因為鏈表的長度可能不一樣 if(l1 != null){ tmp.next = l1; }else{ tmp.next = l2; } return res.next; } }
在別的博客中看到另一種解法,就是用優先隊列,感覺挺高大上的,所以貼出來和大家分享,只是上面的方法我們容易理解一些罷了。
代碼如下:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { if(lists == null || lists.length < 0){ return null; } PriorityQueue<Integer> queue = new PriorityQueue(); for(ListNode node:lists){ while(node != null){ queue.add(node.val); node = node.next; } } ListNode res = new ListNode(0); ListNode tmp= res; while(!queue.isEmpty()){ ListNode temp = new ListNode(queue.poll()); tmp.next = temp; tmp = tmp.next; } return res.next; } }