首先我們要看一道題 對於我們解題很重要
while迴圈是固定的。
這道題沒毛病看到都知道用雙指標,但是快慢結點的初始賦值是怎麼樣的呢。
(1)奇數項 fast=head
沒毛病 3是中點。
(2)偶數項 fast=head(要求slow為中點的兩個的第二個)
符合條件。
來看歸併排序鍊錶
如果我們還用剛才的fast=head會發生2個元素無法分開的情況
會出現上圖的情況。右鍊錶一直空,左鍊錶一直遞迴下去 棧溢位。
所以,我們根據題意 ,slow不應該和876題一樣 要最中間的結點,應該要876中點的前乙個結點。所以fast=head.next
我們來看乙個奇數項的完整版
接下來就是進行遞迴拆分了。
寫上面的理由就是:不要發生 無法分解為1個結點的情況(比如剛才2結點無法分 棧溢位)
對鍊錶進行排序(歸併排序)
首先用快慢指標的方法找到鍊錶中間節點,然後遞迴的對兩個子鍊錶排序,把兩個排好序的子鍊錶合併成一條有序的鍊錶。歸併排序應該算是鍊錶排序最佳的選擇了 保證了最好和最壞時間複雜度都是nlogn,而且它在陣列排序中廣受詬病的空間複雜度在鍊錶排序中也從o n 降到了o 1 class solution fas...
資料結構之鍊錶歸併排序
問題 設有兩個無頭結點的單鏈表,頭指標分別為ha,hb,鏈中有資料域data,鏈域next,兩鍊錶的資料都按遞增排序存放,現要求將hb表歸到ha表中,且歸併後ha仍遞增序,歸併中ha表中已有的資料若hb中也有,則hb中的資料不歸併到ha中,hb的鍊錶在演算法中不允許破壞。源程式 include in...
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...