LeetCode热题100道-Day04
- 使用双指针解决问题,先定义了一个虚拟头节点dummy,dummy.next指向head,定义fast和slow指针,初始值为dummy。fas先走n + 1步,只有走n + 1步,后面同时移动时,slow才能移动到操作节点,也就是删除节点的前一个。fast和slow再同时移动,直到fast移到末尾,再删除目标节点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
for (int i = 0; i < n + 1; i++) {
fast = fast.next;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
ListNode x = slow;
x.next = x.next.next;
return dummy.next;
}
}
- 使用栈解决,先创建一个栈stack,遍历字符串的每一个字符,如果遇到“(”就把相应的“)”进栈,如果遇到“{”就把相应的“}”进栈,如果遇到“[”就把相应的“]”进栈,遍历字符串匹配的过程中,栈已经为空了或者没有匹配的字符了,说明 没有匹配的字符返回 false。遍历完,如果栈空,则返回 true,否则返回 true。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
if (c == '(') {
stack.push(')');
} else if (c == '{') {
stack.push('}');
} else if (c == '[') {
stack.push(']');
} else if (stack.empty() || c != stack.pop()) {
return false;
}
}
if (stack.empty()) {
return true;
}
return false;
}
}
- 使用了一个虚拟头节点的小技巧,使用虚拟头节点简化边界情况的处理,可以避免处理空指针的情况。比较 p1 和 p2 两个指针,将值较小的的节点接到 p 指针,被接的链表前进,p指针不断前进。如果p1或p2为空链表,则只需要考虑另外一条链表。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummy = new ListNode(-1), p = dummy;
ListNode p1 = list1, p2 = list2;
while (p1 != null && p2 != null) {
if (p1.val > p2.val) {
p.next = p2;
p2 = p2.next;
} else {
p.next = p1;
p1 = p1.next;
}
p = p.next;
}
if (p1 != null) {
p.next = p1;
}
if (p2 != null) {
p.next = p2;
}
return dummy.next;
}
}