演算法:排序連結串列:歸併排序
題目:
給定連結串列的頭結點 head ,請將其按 升序 排列並返回 排序後的連結串列 。
head = [4,2,1,3]
輸出:[1,2,3,4]
解題
1,最簡單的演算法,就是挨個遍歷連結串列,將其加入陣列,通過陣列排序。但這樣的空間複雜度比較高。
2,我們學過歸併排序。那就用歸併排序來解題。
概念:歸併排序就是有 n 個數字:2,4,1,5,3…
先兩個兩個的排序,再兩組兩組的排序。
程式碼
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
if (head == null) {
return head;
}
int length = 0;
ListNode node = head;
while (node != null) {
length++;
node = node.next;
}
ListNode dummyHead = new ListNode(0, head);
for (int sublen=1;sublen<length;sublen<<=1){
ListNode pre = dummyHead;
ListNode curr = dummyHead.next;
ListNode head1;
ListNode head2;
while (curr!=null){
head1 = curr;
for (int i=1;i<sublen && curr.next!=null;i++){
curr = curr.next;
}
head2 = curr.next;
curr.next = null; // 斷開連結串列1
curr = head2;
for (int i=1;i<sublen && curr!=null && curr.next!=null;i++){
curr = curr.next;
}
ListNode next=null;// 用來儲存curr
if (curr!=null){
next = curr.next;
curr.next = null; // 斷開連結串列2
}
ListNode mergeNode = merge(head1,head2);
pre.next = mergeNode;
while(pre.next!=null){
pre = pre.next;
}
curr = next;
}
}
return dummyHead.next;
}
public ListNode merge(ListNode head1, ListNode head2) {
ListNode dumpHead = new ListNode();
ListNode temp = dumpHead;
while (head1!=null && head2!=null){
if (head1.val<head2.val){
temp.next = head1;
head1 = head1.next;
} else {
temp.next = head2;
head2 = head2.next;
}
temp = temp.next;
}
if (head1!=null){
temp.next = head1;
}else if(head2!=null){
temp.next = head2;
}
return dumpHead.next;
}
}
相關文章
- [C++]歸併排序(連結串列描述)C++排序
- 利用遞迴實現連結串列的排序(歸併排序)遞迴排序
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- 排序演算法__歸併排序排序演算法
- 排序演算法:歸併排序排序演算法
- 排序演算法 - 歸併排序排序演算法
- 排序演算法(歸併排序)排序演算法
- 歸併排序--排序演算法排序演算法
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 合併K個排序連結串列排序
- 排序演算法之 '歸併排序'排序演算法
- 歸併排序:陣列和連結串列的多種實現排序陣列
- 資料結構與演算法——排序演算法-歸併排序資料結構演算法排序
- 排序演算法之「歸併排序(Merge Sort)」排序演算法
- 連結串列合併-排序-logo列印參考排序Go
- 快速排序&&歸併排序排序
- 演算法之歸併排序演算法排序
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 演算法(氣泡排序,快排,歸併排序)演算法排序
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- 【資料結構與演算法】歸併排序資料結構演算法排序
- 歸併排序排序
- 四、歸併排序 && 快速排序排序
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- 148. 排序連結串列排序
- 連結串列-插入排序排序
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 演算法學習 – 歸併排序演算法排序
- 演算法學習 - 歸併排序演算法排序
- JZ-016-合併兩個排序的連結串列排序
- 歸併排序--二路排序排序
- 歸併排序和基數排序排序
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- java歸併排序Java排序
- 歸併排序演算法(merge_Sort)排序演算法
- 從演算法開始[歸併排序]演算法排序
- php實現 歸併排序,快速排序PHP排序