首先用快慢指標的方法找到鍊錶中間節點,然後遞迴的對兩個子鍊錶排序,把兩個排好序的子鍊錶合併成一條有序的鍊錶。歸併排序應該算是鍊錶排序最佳的選擇了
,保證了最好和最壞時間複雜度都是nlogn,而且它在陣列排序中廣受詬病的空間複雜度在鍊錶排序中也從o(n)降到了o(1)
class solution
fast = slow;
slow = slow->next;
fast->next = null;
fast = mergesortlist(head);//前半段排序
slow = mergesortlist(slow);//後半段排序
return merge(fast,slow);}}
// merge two sorted list to one
listnode *merge(listnode *head1, listnode *head2)
else
p = res;
while(head1 != null && head2 != null)
else
p = p->next;
}if(head1 != null)p->next = head1;
else if(head2 != null)p->next = head2;
return res;
}};
鍊錶排序 歸併排序
要求在空間複雜度為o 1 的情況下對鍊錶進行排序,在不考慮時間複雜度的情況下可以考慮氣泡排序,只對鍊錶中的值進行操作,這樣時間複雜度為o n 2 用歸併排序,時間複雜度為o nlogn 以下為歸併排序 實現 public listnode sortlist listnode head private...
資料結構 使用歸併排序對鍊錶進行排序
首先我們要看一道題 對於我們解題很重要 while迴圈是固定的。這道題沒毛病看到都知道用雙指標,但是快慢結點的初始賦值是怎麼樣的呢。1 奇數項 fast head 沒毛病 3是中點。2 偶數項 fast head 要求slow為中點的兩個的第二個 符合條件。來看歸併排序鍊錶 如果我們還用剛才的fas...
鍊錶歸併排序
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...