148 排序鍊錶

2021-10-14 03:14:44 字數 3367 閱讀 1388

題目:

思路:

首先這題是歸併排序的思想,

歸併排序**:

void

merge

(vector<

int>

&arr,

int start,

int end,

int mid, vector<

int>

&temparr)

else

}while

(i_start<= i_end)

//這是判斷的

while

(j_start <= j_end)

//輔助空間資料覆蓋到原空間

for(

int i=

0;ivoid

mergesort

(vector<

int>

&arr,

int start,

int end, vector<

int>

&temparr)

//劃分到最後是每乙個裡面只有乙個資料

int mid =

(start + end)/2

;mergesort

(arr,start,mid, temparr)

;mergesort

(arr, mid+

1, end, temparr)

;merge

(arr, start, end, mid, temparr)

;}

模仿陣列中的兩兩歸併,單鏈表排序也就是說我們需要進行每次劃分,這個相當於歸併排序**中的(left+right)/2 ,然後到達某個不能再劃分的條件下面的時候再進行兩兩歸併。也就是merge函式

這題我們需要注意的是

1.不能再劃分的狀態,在陣列中是start>=end,單鏈表中呢?

我們需要知道在陣列vector中start>=end 不能改為start>end 不然會在sort中造成死迴圈。

單鏈表中終止條件是 head == nullptr 與 head->next == nullptr先後循序是不能交換的

if

(head ==

nullptr

|| head-

>next ==

nullptr

)return head;

2.陣列中vector中進行歸併排序過程中有mid,單鏈表中的mid又是如何表示的?

我們首先需要知道vector中mid是為了將陣列的vector分成兩個部分

因此我們只需要將鍊錶分成兩個部分就可以了

分成兩個鍊錶就是說

有兩種寫法

方法一:

listnode* slow = head;

listnode* fast = head-

>next;

while

(fast!=

nullptr

&&fast-

>next!=

nullptr

) listnode* righthead = slow-

>next;

slow-

>next =

nullptr

;

方法二:

listnode* slow = head;

listnode* fast = head;

listnode* pre = head;

while

(fast !=

nullptr

&&fast-

>next !=

nullptr

)//中間分開

//將原本的整個單鏈表分成兩個單鏈表(分)

listnode* righthead = slow;

pre-

>next =

nullptr

;

3.陣列中sort和merge是沒有返回值的,但是單鏈表中不支援隨機訪問,因此是需要返回值的

我們通過第二個問題就可以知道了,返回值就是每次劃分鍊錶的頭結點

**:

#include

using

namespace std;

// definition for singly-linked list.

struct listnode

listnode

(int x)

:val

(x),

next

(nullptr

)listnode

(int x, listnode *next)

:val

(x),

next

(next)};

class

solution

將原本的整個單鏈表分成兩個單鏈表(分)

//listnode* righthead = slow;

//pre->next = nullptr;

listnode* slow = head;

listnode* fast = head-

>next;

while

(fast!=

nullptr

&&fast-

>next!=

nullptr

) listnode* righthead = slow-

>next;

slow-

>next =

nullptr

; listnode* leftlist =

sortlist

(head)

; listnode* rightlist =

sortlist

(righthead)

;return

merge

(leftlist, rightlist)

;//merge的含義是並

} listnode*

merge

(listnode* leftlist, listnode* rightlist)

else}if

(leftlist !=

nullptr)if

(rightlist!=

nullptr

)return dummpy-

>next;}}

;

148 排序鍊錶

根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...

148 排序鍊錶

自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...

148 排序鍊錶

難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...