LeetCode 148 排序鍊錶

2021-10-02 19:58:16 字數 2332 閱讀 8811

在 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)的,

需要複製出相等的空間來進行賦值歸併。對於鍊錶,實際上是可以實現常數空間占用的(鍊錶的歸併排序不需要額外的空間)。

利用歸併的思想,遞迴地將當前鍊錶分為兩段,然後merge,分兩段的方法是使用 fast-slow 法,用兩個指標,乙個每次走兩步,乙個走一步,知道快的走到了末尾慢的所在位置就是中間位置,這樣就分成了兩段。

merge時,把兩段頭部節點值比較,用乙個 p 指向較小的,且記錄第乙個節點,然後 兩段的頭一步一步向後走,p也一直向後走,總是指向較小節點, 直至其中乙個頭為null,處理剩下的元素。最後返回記錄的頭即可。

主要考察3個知識點,

知識點1:歸併排序的整體思想

知識點2:找到乙個鍊錶的中間節點的方法

知識點3:合併兩個已排好序的鍊錶為乙個新的有序鍊錶

/**

* definition for singly-linked list.

* public class listnode

* }*/class

solution

//鍊錶排序

public listnode mergesort

(listnode head)

//定義快慢指標,找出中位點

listnode slowp = head, fastp = head.next.next, l , r;

while

(fastp != null && fastp.next != null)

//對右半部分進行排序

r =mergesort

(slowp.next)

;//鍊錶判斷結束的標誌:末尾節點.next==null

slowp.next = null;

l =mergesort

(head)

;return

mergelist

(l, r);}

// 合併鍊錶

private listnode mergelist

(listnode l, listnode r)

else

p= p.next;

}//出現其中一者為null的情況

p.next = l == null?r:l;

return tmphead.next;

}}

/**

* definition for singly-linked list.

* public class listnode

* }*/class

solution

// 沒有條件,創造條件。自己新增頭節點,最後返回時去掉即可。

listnode newhead =

newlistnode(-

1); newhead.next = head;

return

quicksort

(newhead, null);}

public listnode quicksort

(listnode head, listnode end)

//小於劃分點的值儲存在臨時鍊錶中

listnode tmphead =

newlistnode(-

1);// partition為劃分點,p為鍊錶指標,tp為臨時鍊錶指標

listnode partition = head.next, p = partition, tp = tmphead;

//將小於劃分點的值放入臨時鍊錶中

while

(p.next != end)

else

}//合併臨時鍊錶和原鍊錶,將原鍊錶接到臨時鍊錶後面即可

tp.next = head.next;

//將臨時鍊錶插回原鍊錶,注意是插回!!(不做這一步在對右半部分處理時就斷鏈了)

head.next = tmphead.next;

quicksort

(head, partition)

;quicksort

(partition, end)

;//題目要求不帶頭節點,返回時應該去掉

return head.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....