力扣c語言實現 148 排序鍊錶

2021-10-03 03:20:32 字數 1324 閱讀 9483

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

示例 1:

輸入: 4->2->1->3

輸出: 1->2->3->4

示例 2:

輸入: -1->5->3->4->0

輸出: -1->0->3->4->5

typedef

struct listnode node;

struct listnode*

sortlist

(struct listnode* head)

node *tmphead = head;

node *ptail = head;

node *pcur = head->next;

while

(pcur !=

null

)else

else

//進入這裡,可以確定當前節點在有序序列的插入範圍即不在頭也不在尾,只能在有序序列中間查詢到它的插入位置

else

//得到插入位置,插入}}

}}return head;

}

2中的做法時間複雜度為o(n^2),現在給乙個o(nlogn)的,現在面試太難了,大家都會的題目,面試官就考要求更優的解法!

/**

* definition for singly-linked list.

* struct listnode ;

*/typedef

struct listnode node;

node *

cutlist

(node *list,

int size)if(

!p) node *newhead = p->next;

p->next =

null

;return newhead;

}node *

mergelist

(node *list1,node *list2)

else}if

(list1)

if(list2)

return tmp.next;

}struct listnode*

sortlist

(struct listnode* head)

if(length <=1)

printf

("%d\n"

,length)

;for

(int i =

1; i < length;i<<=1)

}}return tmp.next;

}

力扣 148 排序鍊錶

傳送門 題目分析 題目要求時間複雜度為 o nlogn 空間複雜度為 o 1 根據時間複雜度,我們自然能想到二分,故這裡要用到歸併排序。對鍊錶的排序,可以通過修改指標來更改節點順序,無需像陣列一樣額外開闢儲存空間。歸併排序有遞迴和非遞迴的做法,這裡採用遞迴的做法。首先,講一下什麼是歸併排序?歸併排序...

力扣 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 示例 ...

148 排序鍊錶

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