您好,登錄后才能下訂單哦!
這篇文章給大家介紹golang中怎么合并K個排序鏈表,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
合并 k 個排序鏈表,返回合并后的排序鏈表。請分析和描述算法的復雜度。
示例:
輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6
解題思路:
這是一個數組+鏈表組合題目,看到鏈表有序,我們首先想到鏈表合并子問題
1,這是合并兩個有序鏈表的基礎上的擴展
2,簡單思路
將依次將第二個起都合并到第一個,復雜度O(k*n)
3,思路二,兩兩合并,復雜度O(logk*n)
4,注意長度可能是奇數,即使是偶數,兩兩合并后可能是奇數,需要特殊處理,否則數組越界問題很難處理,很容易死循環
5,擴展思路
用優先隊列,每次取最小的元素合并,然后把當前鏈表下一個元素入隊,直到隊列為空
代碼實現
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
k:=len(lists)
if k==0{
return nil
}
for k>1{
if k%2==1{
lists[0]=merge(lists[0],lists[k-1])
}
k/=2
for i:=0;i<k;i++{
lists[i]=merge(lists[k+i],lists[i])
}
}
return lists[0]
}
func merge(l1,l2 *ListNode)*ListNode{
h:=&ListNode{}
tmp:=h
for l1!=nil && l2!=nil{
if l1.Val<l2.Val{
tmp.Next=l1
l1=l1.Next
}else{
tmp.Next=l2
l2=l2.Next
}
tmp=tmp.Next
}
if l1!=nil{
tmp.Next=l1
}
if l2!=nil{
tmp.Next=l2
}
return h.Next
}
關于golang中怎么合并K個排序鏈表就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。