LeetCode 148 排序鍊錶(中等)

2021-10-10 10:47:18 字數 2739 閱讀 4868

給你鍊錶的頭結點 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 =

輸出:歸併排序 遞迴

時間複雜度o(nlog(n))

空間複雜度o(log(n))遞迴棧的空間複雜度

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* }*/class

solution

// 2、找到鍊錶中間節點並斷開鍊錶 & 遞迴下探

listnode middlehead =

middlehead

(head)

; listnode righthead = middlehead.next;

middlehead.next = null;

listnode left =

sortlist

(head)

; listnode right =

sortlist

(righthead)

;// 3、當前層業務操作(合併有序鍊錶)

return

mergetwolists

(left, right);}

// 找到鍊錶中間節點(876. 鍊錶的中間結點 如果有兩個中間節點,就找到前乙個)

private listnode middlehead

(listnode head)

return slow;

}// 合併兩個有序鍊錶(21. 合併兩個有序鍊錶)

public listnode mergetwolists

(listnode l1, listnode l2)

curnode.next = l1 != null ? l1 : l2;

return sentine.next;

}}

迭代歸併法bottom-to-up的歸併思路是這樣的:先兩個兩個的 merge,完成一趟後,再 4 個4個的 merge,直到結束。舉個簡單的例子:[4,3,1,7,8,9,2,11,5,6].

step=1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)

step=2: (1->3->4->7)->(2->8->9->11)->(5->6)

step=4: (1->2->3->4->7->8->9->11)->5->6

step=8: (1->2->3->4->5->6->7->8->9->11)

煉表裡操作最難掌握的應該就是各種斷鏈啊,然後再掛接啊。在這裡,我們主要用到鍊錶操作的兩個技術:

該思路來自leetcode

時間複雜度o(nlog(n))

空間複雜度o(1)

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* }*/class

solution

listnode tmp = head;

int len =0;

while

(tmp != null)

listnode dummy =

newlistnode()

; dummy.next = head;

for(

int size =

1; size < len; size *=2)

}return dummy.next;

}public listnode cut

(listnode node,

int size)

node = node.next;

size--;}

return null;

}// 合併兩個有序鍊錶(21. 合併兩個有序鍊錶)

public listnode mergetwolists

(listnode l1, listnode l2)

curnode.next = l1 != null ? l1 : l2;

return sentine.next;

}}

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在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...

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歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...

leetcode148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 看到題目就知道要二分,這裡用的是遞迴版歸併 definition for singly linked list....