合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:輸入:
[1->4->5,
1->3->4,
2->6
]輸出: 1->1->2->3->4->4->5->6
比較好的兩種思路
1、與合併兩個有序鍊錶一樣,k個鍊錶一起從頭往尾走,每次選取k個鍊錶中指標指向位置的最小值,這個最小值使用優先佇列維護較為合適。
2、鍊錶之間兩兩合併,可復用兩個有序鍊錶合併的**。
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
if(lists.
size()
==1)if
(lists.
size()
>1)
lists = liststemp;
return
mergeklists
(lists);}
else
liststemp.
push_back
(lists[lists.
size()
-1])
; lists = liststemp;
return
mergeklists
(lists);}
}return
null;}
listnode*
mergetwolists
(listnode* l1, listnode* l2)
else
if(l1 ==
null
)else
if(l2 ==
null
)else
else
listnode* tans = ans;
while
(t1&&t2)
else
}while
(t1)
while
(t2)
}return ans;}}
;
debug**:
#include
using
namespace std;
struct listnode };
class
solution
if(lists.
size()
==1)if
(lists.
size()
>1)
lists = liststemp;
return
mergeklists
(lists);}
else
liststemp.
push_back
(lists[lists.
size()
-1])
; lists = liststemp;
return
mergeklists
(lists);}
}return
null;}
listnode*
mergetwolists
(listnode* l1, listnode* l2)
else
if(l1 ==
null
)else
if(l2 ==
null
)else
else
listnode* tans = ans;
while
(t1&&t2)
else
}while
(t1)
while
(t2)
}return ans;}}
;int
main()
listnode* l21 =
newlistnode(1
);listnode* l22 =
newlistnode(3
);listnode* l23 =
newlistnode(4
);l21-
>next = l22;
l22-
>next = l23;
listnode* l31 =
newlistnode(2
);listnode* l32 =
newlistnode(6
);l31-
>next = l32;
vector> test;
test.
push_back
(l11)
; test.
push_back
(l21)
; test.
push_back
(l31)
; listnode* ans = s.
mergeklists
(test)
;while
(ans)
return0;
}
LeetCode 23 合併 K個排序序列
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...
leetcode 23 合併K排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解析 看到這一題,馬上就能想到之前的合併兩個鍊錶leetcode 21.合併兩個有序鍊錶 這一題相當於上一題的公升級版,從合併的實現方法上來說可以...
Leetcode23 合併K個排序鍊錶
題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...