148 排序鍊錶 歸併排序 快速排序

2022-02-13 11:22:36 字數 1388 閱讀 9835

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

輸入:4-

>2-

>1-

>

3輸出:1-

>2-

>3-

>

4

歸併排序法:

利用快慢指標將鍊錶分為前後半段

先對slow.next找到後半段並進行排序

斷開鍊錶前後半段,對前半段進行排序

合併排序完成後的左右兩條鍊錶

function

mergetwolists

(x, y)

else

p = p.next;

}/* 連線剩餘部分 */

p.next = x ? x : y;

return root.next;

}function

mergesort

(root)

/* 對右半部分進行歸併 */

let right =

mergesort

(slow.next)

;/* 斷開左右連線 */

slow.next =

null

;/* 左半部分歸併 */

let left =

mergesort

(root)

;/* 合併左右 */

return

mergetwolists

(left, right);}

varsortlist

=function

(head)

;

快速排序法:

設定頭尾指標,將第乙個結點的值作為參考值,

遍歷後面的元素,將小於參考值的節點抽離到臨時鍊錶

此時原煉表全為大於等於參考值的元素,且第乙個值為參考值,臨時鍊錶全為小於參考值的元素,將原鍊錶接到臨時鍊錶後面即將參考節點放到了最終的位置

覆蓋原鍊錶,對參考值左邊和右邊元素進行相同的操作

/* 對(st,ed)區間的元素進行排序 */

function

quicksort

(st, ed)

else

}/* 原煉表全大於p 臨時鍊錶全小於p*/

tp.next = st.next;

st.next = tpst.next;

quicksort

(st, p)

;quicksort

(p, ed)

;return st.next;

}var

sortlist

=function

(head)

;

148 排序鍊錶 歸併排序

難度 中等 題目描述 解題思路 148.排序鍊錶 2020 8 13 1對鍊錶進行歸併排序 1 快慢指標找中間節點 2 遞迴呼叫mergesort 3 合併有序鍊錶 public listnode sortlist listnode head public listnode listmergesor...

148 排序鍊錶 中等 鍊錶 歸併排序

給你鍊錶的頭結點head,請將其按 公升序 排列並返回 排序後的鍊錶 高階 你可以在o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序嗎?示例 1 輸入 head 4,2,1,3 輸出 1,2,3,4 示例 2 輸入 head 1,5,3,4,0 輸出 1,0,3,4,5 示例 3 ...

leetcode 148 排序鍊錶 歸併排序

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3輸出 1 2 3 4示例 2 輸入 1 5 3 4 0輸出 1 0 3 4 5 思路 看到o n log n 首先想到的是遞迴,排序中的歸併遞迴排序滿足這個時間複雜度 難點一 找到乙個連表的中間節點...