Leetcode--23.合并K个排序链表(Java)
合并?k?個排序鏈表,返回合并后的排序鏈表。請分析和描述算法的復(fù)雜度。
示例:
輸入:
[
??1->4->5,
??1->3->4,
??2->6
]
輸出: 1->1->2->3->4->4->5->6
思路:分治法
多個鏈表,兩兩合并,第一個和第二個合并,第三個和第四個合并....
如果鏈表的個數(shù)是奇數(shù),最后一個先不處理,添加到這次處理完的鏈表隊(duì)列后面
代碼:
/**
?*?Definition?for?singly-linked?list.
?*?public?class?ListNode?{
?*?????int?val;
?*?????ListNode?next;
?*?????ListNode(int?x)?{?val?=?x;?}
?*?}
?*/
class?Solution?{
????public?ListNode?mergeKLists(ListNode[]?lists)?{
????????int?n?=?lists.length;
????????if(n<1)?return?null;
????????if(n==1)?return?lists[0];
????????while(n>1){
????????????int?i;
????????????for(i=0;i<n/2;i++){
????????????????lists[i]?=?mergeTwoLists(lists[i*2],lists[2*i+1]);
????????????}
????????????if(n%2==1){
????????????????lists[i]?=?lists[n-1];
????????????????n++;
????????????}
????????????n/=2;
????????}
????????return?lists[0];
????}
?????public?ListNode?mergeTwoLists(ListNode?l1,?ListNode?l2)?{
????????ListNode?p?=?l1,q?=?l2;
????????
????????int?t=0;
????????ListNode?result?=?new?ListNode(0);
????????ListNode?x?=?result;
????????while(p!=null||q!=null)
????????{
??????????????x.next?=?new?ListNode(0);
????????????x?=?x.next;
????????????if(p!=null&&q!=null)
????????????{
????????????????if(p.val<=q.val)
????????????????{
????????????????????x.val?=?p.val;
????????????????????p?=?p.next;
????????????????}
????????????????else
????????????????{
????????????????????x.val?=?q.val;
????????????????????q?=?q.next;
????????????????}???
????????????}
????????????else?if(p!=null)
????????????{
????????????????x.val?=?p.val;
????????????????p?=?p.next;
????????????}
????????????else
????????????{
?????????????????x.val?=?q.val;
?????????????????q?=?q.next;
????????????}
??????????
????????}
????????return?result.next;
????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--23.合并K个排序链表(Java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++基本数据类型
- 下一篇: Java中文件的创建