單鏈表的歸併排序

2021-08-31 03:05:31 字數 1218 閱讀 7494

**

question: 148. sort list

sort a linked list in o(n log n) time using constant space complexity.

中文:使用恆定的空間複雜度排序乙個鍊錶,要求時間複雜度是o(nlogn)

我們知道題目的要求是時間複雜度是o(nlogn), 很自然我們就想到了二路歸併排序或則是快速排序。碎玉快速排序來說,設計到大量的精準索引定位,所以對於雙鏈表來說更加適合,而這裡是單鏈表,所以我選擇二路歸併排序。

現在我們這裡需要用單鏈表實現,唯一的區別就是鍊錶的分片,這裡的分片我們選用的方法是雙指標法,每次乙個指標後移一位,另外乙個後移兩位。

/**

* 合併兩個有序鍊錶

* @param l1

* @param l2

* @return

*/private static listnode merge(listnode l1, listnode l2) else

p = p.next;

}if (l1 != null)

p.next = l1;

if (l2 != null)

p.next = l2;

return l.next;

}/**

* 鍊錶的二路歸併排序

* @param head

* @return

*/public static listnode sortlist(listnode head)

//1. 將list 切分為兩個部分

listnode prev=null, slow=head, fast=head;

while (fast !=null && fast.next !=null)

prev.next = null;//將鍊錶切斷

//分別排序前後兩個部分

listnode l1 = sortlist(head);

listnode l2 = sortlist(slow);

return merge(l1, l2);

}

測試用例:

public static void main(string args) 

}

執行結果:

0,1,2,3,4,

單鏈表歸併排序

1 對於鍊錶來說,由於其元素的訪問只能是順序訪問,而快速排序是改進後的氣泡排序,需要隨機訪問資料,不合適。採用歸併排序方式對鍊錶元素進行訪問 2 需要的步驟 1 分割 將一段鍊錶分成兩部分 2 排序 將兩端已經有序的鍊錶合併 3 分治遞迴 遞迴操作 將鍊錶plist分割,並把分割後的兩段鍊錶第乙個元...

單鏈表的歸併排序

題目 單鏈表的歸併排序 思路 首先找到鍊錶的中間節點,將原始鍊錶一分為二,遞迴進行該操作,直到被劃分的兩個鍊錶包含的節點少於等於1個,即該次劃分後兩個鍊錶已經有序。然後依次合併兩個有序的鍊錶,直到所有劃分都合併完,即排序完畢。主要編寫將兩個有序鍊錶合併為乙個有序鍊錶的函式。includeusing ...

Java單鏈表歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。找到中間點,然後分割 publi...