給你鍊錶的頭結點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:
輸入:head =
輸出:
鍊錶的歸併排序,使用了遞迴方法,希望再碰到鍊錶的歸併問題能做出來
/**
* definition for singly-linked list.
* public class listnode
* listnode(int val)
* listnode(int val, listnode next)
* }*/class
solution
public listnode sortlist
(listnode head, listnode tail)
// 非常關鍵的一步,切割鍊錶
if(head.next == tail)
// 使用雙指標切割鍊錶,乙個一次走一步,乙個走兩步
listnode t1 = head, t2 = head;
while
(t2 != tail)
}// 預設tail不算節點,也不參與
listnode l1 =
sortlist
(head, t1)
; listnode l2 =
sortlist
(t1, tail)
;// 合併兩個有序鍊錶
return
merge
(l1, l2);}
public listnode merge
(listnode l1, listnode l2)
else
t = t.next;}if
(t1 != null)
if(t2 != null)
return dummyhead.next;
}}
148 排序鍊錶 歸併排序
難度 中等 題目描述 解題思路 148.排序鍊錶 2020 8 13 1對鍊錶進行歸併排序 1 快慢指標找中間節點 2 遞迴呼叫mergesort 3 合併有序鍊錶 public listnode sortlist listnode head public listnode listmergesor...
148 排序鍊錶 歸併排序 快速排序
在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。輸入 4 2 1 3輸出 1 2 3 4 歸併排序法 利用快慢指標將鍊錶分為前後半段 先對slow.next找到後半段並進行排序 斷開鍊錶前後半段,對前半段進行排序 合併排序完成後的左右兩條鍊錶 function mergetw...
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 首先想到的是遞迴,排序中的歸併遞迴排序滿足這個時間複雜度 難點一 找到乙個連表的中間節點...