在 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 首先想到的是遞迴,排序中的歸併遞迴排序滿足這個時間複雜度 難點一 找到乙個連表的中間節點...