鍊錶排序 歸併

2021-09-24 16:35:54 字數 1230 閱讀 8659

遞迴方法的歸併排序三部曲: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...