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:
輸入:head =
輸出:鍊錶中節點的數目在範圍 [0, 5 * 104] 內
-105 <= node.val <= 105
速度慘不忍睹
/**
* definition for singly-linked list.
* public class listnode
* listnode(int val)
* listnode(int val, listnode next)
* }*/class
solution
else
// 插入current進鍊表
// lastsorted的next指向current的next節點,那lastsorted就是處於current的位置
// 比如,4 2 1 3,2是插入節點,現在節點4的next指向了1
lastsorted.next = current.next;
// 對於4 2 1 3,prev.next指向的是4,現在4.next已經指向1
// 那麼對於插入節點2,原本是指向1的,現在要交換位置,2要指向4,才可以排好序
current.next = prev.next;
// 現在鍊錶變成了,2 4 1 3,prev.next指標是用於找到新插入節點應該插入的位置的,因此應該隨時指向鏈變首節點處
// 原本prev.next和dummynode.next是指向4的,要改動指向位置
// 所以prev.next指向2,就是啞節點指向了2,即 0>2>4>1>3
prev.next = current;
// 注意兩者都是引用了節點2,不是就是節點2
}// 接著就要插入下乙個節點了
// 比如鏈變從4 2 1 3變成了2 4 1 3
// lastsorted指向的是4,current指向的是2
// 新插入節點是1,所以current應指向1,1就是lastsorted的next節點
current = lastsorted.next;
// 那麼現在,current指向1節點,就是新插入的節點
}return dummynode.next;
// 迴圈完成後啞節點的next即為最終排序後的鍊錶
}}
class
solution
public listnode sortlist
(listnode head, listnode tail)
if(head.next == tail)
listnode slow = head, fast = head;
while
(fast != tail)
} listnode mid = slow;
listnode list1 =
sortlist
(head, mid)
; listnode list2 =
sortlist
(mid, tail)
; listnode sorted =
merge
(list1, list2)
;return sorted;
}public listnode merge
(listnode head1, listnode head2)
else
temp = temp.next;}if
(temp1 != null)
else
if(temp2 != null)
return dummyhead.next;
}}
複雜度分析
class
solution
int length =0;
listnode node = head;
while
(node != null)
listnode dummyhead =
newlistnode(0
, head)
;for
(int sublength =
1; sublength < length; sublength <<=1)
listnode head2 = curr.next;
curr.next = null;
curr = head2;
for(
int i =
1; i < sublength && curr != null && curr.next != null; i++
) listnode next = null;
if(curr != null)
listnode merged =
merge
(head1, head2)
; prev.next = merged;
while
(prev.next != null)
curr = next;}}
return dummyhead.next;
}public listnode merge
(listnode head1, listnode head2)
else
temp = temp.next;}if
(temp1 != null)
else
if(temp2 != null)
return dummyhead.next;
}}
複雜度分析 每日演算法 洗牌演算法
給定乙個n個數的序列,設計乙個演算法將其隨機打亂,保證每個數出現在任意乙個位置的概率相同 也就是說在n 個的排列中,每乙個排列出現的概率相同 假設輸入為陣列num length 隨機選乙個數,放到num 0 中,再隨機選數,如果該數已經選過,重新選,直到該數未選過時放入num 1 中,以此類推,直到...
每日演算法 報數
1.1 2.11 3.21 4.1211 5.1112211被讀作 one 1 乙個一 即11。11被讀作 two 1s 兩個一 即21。21被讀作 one 2 one 1 乙個二 乙個一 即1211。給定乙個正整數 n 1 n 30 輸出報數序列的第 n 項。注意 整數順序將表示為乙個字串。示例 ...
每日演算法 1
1 leetcode第46題 全排列 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 1 思路 核心思想是在乙個排列的基礎上,1,2,3,按照規律交換位置,得到新的排列。比如1和2交換 2,1,...