描述
在 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...