每日演算法15 2020 11 21

2021-10-10 20:16:58 字數 3080 閱讀 3129

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,...