鍊錶 鍊錶排序 中等

2021-08-21 06:44:02 字數 1483 閱讀 4418

描述

在 o(n log n) 時間複雜度和常數級的空間複雜度下給鍊錶排序。

您在真實的面試中是否遇到過這個題?  

樣例給出 1->3->2->null,給它排序變成 1->2->3->null.

挑戰分別用歸併排序和快速排序做一遍。

題目鏈結

分析快速排序:

演算法只交換節點的val值,平均時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))。

這裡我們還需要注意的一點是陣列的partition兩個引數分別代表陣列的起始位置,兩邊都是閉區間。

對左邊子陣列排序時,子陣列右邊界是middle-1,如果鍊錶也按這種兩邊都是閉區間的話,找到分割後樞紐元middle,找到middle-1還得再次遍歷陣列,因此鍊錶的partition採用前閉後開的區間(這樣排序主函式也需要前閉後開區間)。

歸併排序:演算法交換鍊錶節點,時間複雜度o(nlogn),不考慮遞迴棧空間的話空間複雜度是o(1))。

首先用快慢指標的方法找到鍊錶中間節點,然後遞迴的對兩個子鍊錶排序,把兩個排好序的子鍊錶合併成一條有序的鍊錶。歸併排序應該算是鍊錶排序最佳的選擇了,保證了最好和最壞時間複雜度都是nlogn,而且它在陣列排序中廣受詬病的空間複雜度在鍊錶排序中也從o(n)降到了o(1)。

程式

/**

* definition of singly-linked-list:

* class listnode

* }*/class solution

fast = slow;

slow = slow->next;

fast->next = null;

fast = sortlist(head);//前半段排序

slow = sortlist(slow);//後半段排序

return merge(fast,slow);}}

// merge two sorted list to one

listnode *merge(listnode *head1, listnode *head2)

else

p = res;

while(head1 != null && head2 != null)

else

p = p->next;

}if(head1 != null)p->next = head1;

else if(head2 != null)p->next = head2;

return res;

}//方法二:快速排序

listnode * sortlist(listnode *head)

void qsortlist(listnode*head, listnode*tail)

}listnode* partitionlist(listnode*low, listnode*high)

swap(loc->val, low->val);

return loc;

}};

鍊錶 加一鍊錶 中等

給定乙個非負整數,這個整數表示為乙個非空的單鏈表,每個節點表示這個整數的一位。返回這個整數加一。除了0本身,所有數字在最高位前都沒有0。列表的頭節點存的是這個整數的最高位。您在真實的面試中是否遇到過這個題?是 給出鍊錶1 2 3 null,返回1 2 4 null。definition of sin...

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 示例 3 ...

分隔鍊錶(中等)

分隔鍊錶 中等 給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。struct listnode class solution else head head next larger next nullp...