LeetCode騰訊50題 148排序鍊錶

2021-09-09 01:46:46 字數 1604 閱讀 9013

請注意!!!!主要用來自己馬克自己的筆記,不是最優解!!不是最優解!!不是最優解!!請不要噴我。。。

關鍵點:題目要求在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

思路:o(nlogn) -> 快排、歸併

於是決定:使用歸併排序演算法對鍊錶進行排序。順便複習下各類排序演算法的時間、空間複雜度。

演算法關鍵點:如何取到middle -> 快慢指標,fast每次走兩步,slow每次走一步,fast走到none的時候slow正好是middle。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class solution(object):

def sortlist(self, head):

""":type head: listnode

:rtype: listnode

"""def merge_sort(head):

if head.next==none:

return head

phead = head

pslow = head

pfast = head

pre = head

while pfast!=none and pfast.next!=none:

pre = pslow

pslow = pslow.next

pfast = pfast.next.next

#pslow此時是middle

pre.next = none

link1 = merge_sort(phead)

link2 = merge_sort(pslow)

return merge(link1,link2)

def merge(left,right):

phead = listnode(0)

p = phead

while left!=none and right!=none:

if left.val<=right.val:

p.next = left

left = left.next

else:

p.next = right

right = right.next

p = p.next

while left!=none:

p.next = left

left = left.next

p = p.next

while right!=none:

p.next = right

right = right.next

p = p.next

return phead.next

if head==none or head.next==none:

return head

return merge_sort(head)

leetcode騰訊精選50題(1)

菜鳥第一課 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素...

leetcode 騰訊精選50題 21

given a linked list,rotate the list to the right by k places,where k is non negative.鍊錶的特殊性在於其可以只改變其所指向的位址,而不改變資料存放的真正位址,於是將其收尾閉合後可直接得到乙個閉環的鍊錶,在將其在指定的...

leetcode 騰訊50題 4 50 整數反轉

給定乙個int型整數,請將各位數字反轉。如果結果大於int max或小於int min,請返回0.樣例1輸入 123 輸出 321 樣例2輸入 123 輸出 321 樣例3輸入 120 輸出 21 通過 10每次取出最後一位,然後 10將最後一位刪去,將取出的那位不停加入到翻轉的數字上,當原數字刪除...