生活随笔
收集整理的這篇文章主要介紹了
剑指offer之16-20题解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
劍指offer之16-20題解
目錄
合并兩個排序的鏈表樹的子結構二叉樹的鏡像順時針打印矩陣包含min函數的棧
16. 合并兩個排序的鏈表
(一)題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。
(二)思路
遞歸:如果list1.val<=list2.val,則list1位置不變,它的下一位從list1.next和list2中選出。遞歸。否則list2的位置不變,它的下一位從list1和list2.next中選出。遞歸。
迭代:跟歸并排序一樣,當兩個鏈表不為null時,誰小誰依次加入head節點。最后會有list1或者list2剩余節點沒有加入,遍歷加入即可。
(三)代碼實現
遞歸代碼實現
public class Solution {public ListNode
Merge(ListNode list1
,ListNode list2
) {if (list1
==null
){return list2
;}if (list2
==null
){return list1
;}if (list1
.val
<=list2
.val
){list1
.next
= Merge(list1
.next
,list2
);return list1
;}else {list2
.next
= Merge(list1
,list2
.next
);return list2
;}}
}
迭代代碼實現
public class Solution {public ListNode
Merge(ListNode list1
, ListNode list2
) {ListNode head
= new ListNode(-1);ListNode cur
= head
;while (list1
!= null
&& list2
!= null
) {if (list1
.val
<= list2
.val
) {cur
.next
= list1
;list1
= list1
.next
;} else {cur
.next
= list2
;list2
= list2
.next
;}cur
= cur
.next
;}if (list1
!= null
) {cur
.next
= list1
;}if (list2
!= null
) {cur
.next
= list2
;}return head
.next
;}
}
17. 樹的子結構
(一)題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
(二)思路
isSubtreeWithRoot()方法: 判斷節點A和B是否相同,如果不同返回false。如果相同繼續遞歸A的左孩子和B的左孩子,A的右孩子和B的右孩子看是否相同。當root2==null時,說明比較完畢,返回true;當root1==null時,說明遍歷完A都沒有找到一樣的,返回false;
(三)代碼實現
public class Solution {public boolean HasSubtree(TreeNode root1
, TreeNode root2
) {if (root1
== null
|| root2
== null
)return false;return isSubtreeRoot(root1
, root2
) || HasSubtree(root1
.left
, root2
) || HasSubtree(root1
.right
, root2
);}private boolean isSubtreeRoot(TreeNode root1
, TreeNode root2
) {if (root2
== null
)return true;if (root1
== null
)return false;if (root1
.val
!= root2
.val
)return false;return isSubtreeRoot(root1
.left
, root2
.left
) && isSubtreeRoot(root1
.right
, root2
.right
);}
}
18. 二叉樹的鏡像
(一)題目描述
(二)思路
交換左右節點,然后依次遞歸下去。
(三)代碼實現
public class Solution {public void Mirror(TreeNode root
) {if (root
== null
)return;swap(root
);Mirror(root
.left
);Mirror(root
.right
);}private void swap(TreeNode root
) {TreeNode t
= root
.left
;root
.left
= root
.right
;root
.right
= t
;}
}
19. 順時針打印矩陣
(一)題目描述
輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
(二)思路
找到左上角和右下角,打印一圈,然后左上角++,右下角–,再次打印一圈,依次類推
(三)代碼實現
大佬代碼
import java
.util
.ArrayList
;
public class Solution {public ArrayList
<Integer> printMatrix(int[][] matrix
) {ArrayList
<Integer> ret
= new ArrayList<>();int r1
= 0, r2
= matrix
.length
- 1, c1
= 0, c2
= matrix
[0].length
- 1;while (r1
<= r2
&& c1
<= c2
) {for (int i
= c1
; i
<= c2
; i
++) {ret
.add(matrix
[r1
][i
]);}for (int i
= r1
+ 1; i
<= r2
; i
++) {ret
.add(matrix
[i
][c2
]);}if (r1
!= r2
) {for (int i
= c2
- 1; i
>= c1
; i
--) {ret
.add(matrix
[r2
][i
]);}}if (c1
!= c2
) {for (int i
= r2
- 1; i
> r1
; i
--) {ret
.add(matrix
[i
][c1
]);}}r1
++;r2
--;c1
++;c2
--;}return ret
;}
}
比較好理解的代碼,不過長了一點
import java
.util
.ArrayList
;
public class Solution {public ArrayList
<Integer> printMatrix(int[][] matrix
) {int ar
= 0, ac
= 0, br
= matrix
.length
- 1, bc
= matrix
[0].length
- 1;ArrayList
<Integer> list
= new ArrayList<>();while (ar
<= br
&& ac
<= bc
) {ArrayList
<Integer> list1
= printRound(matrix
, ar
++, ac
++, br
--, bc
--);for (int i
= 0; i
< list1
.size(); i
++) {list
.add(list1
.get(i
));}}return list
;}private ArrayList
<Integer> printRound(int[][] matrix
, int ar
, int ac
, int br
, int bc
) {ArrayList
<Integer> list
= new ArrayList<Integer>();if (ar
== br
) {for (int i
= ac
; i
<= bc
; i
++) {list
.add(matrix
[ar
][i
]);}} else if (ac
== bc
) {for (int i
= ar
; i
<= br
; i
++) {list
.add(matrix
[i
][ac
]);}} else {int curr
= ar
;int curc
= ac
;while (curc
!= bc
) {list
.add(matrix
[ar
][curc
]);curc
++;}while (curr
!= br
) {list
.add(matrix
[curr
][bc
]);curr
++;}while (curc
!= ac
) {list
.add(matrix
[br
][curc
]);curc
--;}while (ar
!= curr
) {list
.add(matrix
[curr
][ac
]);curr
--;}}return list
;}
}
20. 包含min函數的棧
(一)題目描述
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間復雜度應為O(1))。
(二)思路
生成兩個棧,一個存放進入的數據元素dataStack,一個存放最小值minStack。
push操作:dataStack直接入棧,minStack如果為null,直接入棧,不為nullpeek出棧頂元素和入棧的元素比較,誰小誰入棧。pop操作:兩個棧直接pop。top操作:返回dataStack.peek().min操作:peek出minStack棧頂元素
(三)代碼實現
import java
.util
.Stack
;public class Solution {private Stack
<Integer> dataStack
= new Stack<>();private Stack
<Integer> minStack
= new Stack<>();public void push(int node
) {dataStack
.push(node
);minStack
.push(minStack
.isEmpty() ? node
: Math
.min(minStack
.peek(), node
));}public void pop() {dataStack
.pop();minStack
.pop();}public int top() {return dataStack
.peek();}public int min() {return minStack
.peek();}
}
總結
以上是生活随笔為你收集整理的剑指offer之16-20题解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。