328:
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
public class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null) return null;
ListNode odd = head, even = head.next, evenHead = even;
while (even != null && even.next != null) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}
331:
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如
例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。
你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 “1,3” 。
示例 1:
输入: “9,3,4,#,#,1,#,#,2,#,6,#,#”
输出: true
方法一:利用栈
class Solution {
public boolean isValidSerialization(String preorder) {
Stack stack=new Stack();
String[] strs = preorder.split(",");
stack.push(1);
for(int i=0;i<strs.length;i++){
if(stack.isEmpty())return false;
int value=stack.pop();
if(++value!=2)stack.push(value);
if(!strs[i].equals("#"))stack.push(0);
}
return stack.isEmpty();
}
}
方法二:
不需要栈,从后往前遍历,用num记录#的个数,当遇到正常节点时,#的个数-2,并将该节点转化成#,num+1,,整体即为num-1; 当出现num=0时,即false,最终也须保证num为1。
注意,如果验证后序遍历,只需要从前往后即可,方法同样有效
class Solution {
public boolean isValidSerialization(String preorder) {
int count=0;
String[] strs = preorder.split(",");
for(int i=strs.length-1;i>=0;i–){
if(strs[i].equals("#"))count++;
else count–;
if(count0)return false;
}
return count1;
}
}
334:
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
数学表达式如下:
如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。
示例 1:
输入: [1,2,3,4,5]
输出: true
示例 2:
输入: [5,4,3,2,1]
输出: false
class Solution {
public boolean increasingTriplet(int[] nums) {
int index1=Integer.MAX_VALUE,index2=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]<index1){
index1=nums[i];
}
else if(nums[i]>index1&&nums[i]<index2){
index2=nums[i];
}
else if(nums[i]>index2)return true;
}
return false;
}
}