遞迴方法的歸併排序三部曲:1,快慢指標找中點;2,遞迴呼叫mergesort,3,合併兩個鍊錶。
class solution
listnode* mergesort(listnode* node)
breakn->next = nullptr;
listnode *l1 = mergesort(node);
listnode *l2 = mergesort(slow);
return merge(l1, l2);
}listnode* merge(listnode* l1, listnode* l2) else }}
由於題目要求空間複雜度是 o(1),因此不能使用遞迴。因此這裡使用 bottom-to-up 的演算法來解決。
煉表裡操作最難掌握的應該就是各種斷鏈啊,然後再掛接啊。在這裡,我們主要用到鍊錶操作的兩個技術:
merge(l1, l2),雙路歸併,我相信這個操作大家已經非常熟練的,就不做介紹了。
cut(l, n),可能有些同學沒有聽說過,它其實就是一種 split 操作,即斷鏈操作。不過我感覺使用 cut 更準確一些,它表示,將鍊錶 l 切掉前 n 個節點,並返回後半部分的煉表頭。
額外再補充乙個 dummyhead **,已經講過無數次了,仔細體會吧。因為有了dummy之後,所有的節點都變成擁有前置節點的節點了。所以就不用擔心處理頭節點這個特殊情況了。而且你最後需要返回的僅僅是dummy.next,不用花功夫去保持住你的頭結點了。
希望同學們能把雙路歸併和 cut 斷鏈的**爛記於心,以後看到類似的題目能夠刷到手軟。
class solution
for (int size = 1; size < length; size <<= 1) }}
return dummyhead.next;
}listnode* cut(listnode* head, int n)
if (!p) return nullptr;
auto next = p->next;
p->next = nullptr;
return next;
}listnode* merge(listnode* l1, listnode* l2) else
}p->next = l1 ? l1 : l2;
return dummyhead.next;}};
非遞迴實現線性表的歸併排序:
void merge_sort(int q , int l , int r)
鍊錶排序 歸併排序
要求在空間複雜度為o 1 的情況下對鍊錶進行排序,在不考慮時間複雜度的情況下可以考慮氣泡排序,只對鍊錶中的值進行操作,這樣時間複雜度為o n 2 用歸併排序,時間複雜度為o nlogn 以下為歸併排序 實現 public listnode sortlist listnode head private...
鍊錶歸併排序
include include include include include using namespace std typedef int type typedef struct nodetag node node build type a,int n pnode pnext null retu...
鍊錶歸併排序
主要思路 1 如果為null或者只有乙個節點那麼直接返回 2 將鍊錶分成兩部分,分別進行排序,形成兩個有序鍊錶 3 將兩個有序鍊錶合併 void merge sort struct node list void split struct node head,struct node lista,str...