一、剑指 Offer 06. 从尾到头打印链表
- 使用栈先遍历一遍,然后再弹出即可
- 这个dummyhead可加可不加,但是为了习惯还是加上吧
public int[] reversePrint(ListNode head) {
LinkedList<Integer> list = new LinkedList<>();
ListNode dummyhead = new ListNode();
dummyhead.next = head;
ListNode cur = head;
while(cur!=null){
list.add(cur.val);
cur = cur.next;
}
int[] result = new int[list.size()];
for(int i=0;i<result.length;i++){
result[i] = list.removeLast();
}
return result;
}
15分钟
二、剑指 Offer 25. 合并两个排序的链表
- 使用一个虚拟头结点来做合并后的虚拟头结点。
- cur节点不断向后遍历。只要有一个是空,就退出,然后全盘接收另一个节点。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyhead = new ListNode();
ListNode cur = dummyhead;
ListNode cur1 = l1;
ListNode cur2 = l2;
while(cur1!=null&&cur2!=null){
//这里想得是只要有一个是空,那么就退出,后面再加上那个非空的节点。
if(cur1.val>cur2.val){
cur.next=cur2;
cur2 = cur2.next;
cur = cur.next;
} else{
cur.next = cur1;
cur1 = cur1.next;
cur = cur.next;
}
}
if(cur1!=null) cur.next=cur1;
if(cur2!=null) cur.next=cur2;
return dummyhead.next;
}
20分钟
三、NC371 验证回文字符串(二)
https://www.nowcoder.com/practice/130e1a9eb88942239b66e53ec6e53f51?tpId=196&tqId=40502&ru=/exam/oj
- 首先一个最基本的验证回文字符串,使用双指针。如果两边不相等,则直接返回false,如果到最后,则返回true
- 用一点贪心,如果两边不相等了,试一下删除左节点或删除右节点。
public boolean palindrome (String str) {
int left = 0;
int right = str.length()-1;
while (left <= right) {
if (str.charAt(left) == str.charAt(right)) {
left++;
right--;
} else{
return ishuiwen(str,left+1,right)||ishuiwen(str,left,right-1);
}
}
return true;
}
public boolean ishuiwen(String str, int left, int right) {
while (left <= right) {
if (str.charAt(left) == str.charAt(right)) {
left++;
right--;
} else {
return false;
}
}
return true;
}
20分钟