劍指offer 16 20(牛客網python版)

2021-09-25 14:21:11 字數 3370 閱讀 5890

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

class

solution

:# 返回合併後列表

defmerge

(self, phead1, phead2)

:# write code here

ifnot phead1:

return phead2

ifnot phead2:

return phead1

if phead1.valphead1.

next

=self.merge(phead1.

next

,phead2)

return phead1

else

: phead2.

next

=self.merge(phead1,phead2.

next

)return phead2

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)

有乙個函式a,能夠判斷兩棵樹是否相同

不斷將proot1的子樹與proot2放到函式中比較

返回條件:1、其中乙個為空,2、兩子樹相同

遞迴結構:左子樹和右子樹繼續比較

class

solution

:def

hassubtree

(self, proot1, proot2)

:# write code here

#輔助函式,判斷兩樹是否相同

defissame

(proot1,proot2):if

not proot2:

#必須先判斷proot2,如果先 if not proot1,即使兩樹相同,此時proot1也為空,返回fasle

return

true

ifnot proot1 or proot1.val!=proot2.val:

#不能顛倒順序,否則proot1.val可能為空就比較,會報錯

return

false

return issame(proot1.left,proot2.left)

and issame(proot1.right,proot2.right)

#返回條件,1、其中乙個為空,2、兩子樹相同

ifnot proot1 or

not proot2:

return

false

if issame(proot1,proot2)

:return

true

#遞迴結構,左子樹和右子樹繼續比較

return self.hassubtree(proot1.left,proot2)

or self.hassubtree(proot1.right,proot2)

操作給定的二叉樹,將其變換為源二叉樹的映象。

題目沒有要求要返回節點,原地修改root節點即可,加上return也行

返回條件:為空

遞迴結構:我們只需要保證對每個節點,都交換他的左右節點即可,然後繼續往下

class

solution

:# 返回映象樹的根節點

defmirror

(self, root)

:# write code here

ifnot root:

return

none

root.left,root.right=root.right,root.left

self.mirror(root.left)

self.mirror(root.right)

這個題目很經典,也有點難度

以下解法,基本是看了大佬思路才做出來的

# -*- coding:utf-8 -*-

class

solution

:# matrix型別為二維列表,需要返回列表

defprintmatrix

(self, matrix)

:# write code here

res=

while matrix:

res.extend(matrix.pop(0)

)if matrix and matrix[0]

:#matrix不為空但是matrix[0]可能為空,如[,,]

for r in matrix: ))

#pop函式預設丟擲最後乙個元素

if matrix:

res.extend(matrix.pop()[

::-1

])#丟擲最後一行並將此行逆序加入到res中

if matrix and matrix[0]

:for r in

reversed

(matrix):0

))return res

當然,這個方法破壞了矩陣

我們看到,如果走完一圈之後,整個矩陣縮了一圈,我們可以從matrix[1][1]繼續出發,當然,其他邊界也會相應變化

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式(時間複雜度應為o(1))。

乙個棧常規操作,乙個棧只儲存最小值,這裡有個難點是push()函式中,即使node>stack2[-1]了,也要再加一遍stack2[-1],是為了確保兩個棧數量一樣

所以在pop中,兩個棧也都要pop()出資料,但是只返回常規棧中的節點

# -*- coding:utf-8 -*-

# -*- coding:utf-8 -*-

class

solution

:def

__init__

(self)

: self.stack1=

self.stack2=

defpush

(self, node)

:min

=self.stack2

ifnotmin

or node<

min[-1

]:minelse

:min

min[-1

])defpop

(self)

: self.stack2.pop(

)return self.stack1.pop(

)def

top(self)

:return self.stack1[-1

]def

min(self)

:return self.stack2[-1

]

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...

牛客網 劍指offer 遞迴 (1)

出現的問題 原因 返回值沒有考慮到所有情況 輸入引數n是乙個整數,自己只考慮n 0,n 1,n 2,n 39的情況,一直報錯。改正方案 加上else,判斷其他情況均輸出0,編譯通過 菲波那切數列數列有很多變形的問題 問題1 兔子問題 題目描述 已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後....