LeetCode标签“字符串”、列表“Top100”的两道难度简单的题目。
1.有效的括号
题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
题解:
1.利用栈,遇到开括号时将其放入栈,遇到闭括号时判断栈是否为空(为空则此前无push进对应的开括号,此字符串非法),
栈不为空则从栈中pop出栈顶元素判断括号类型是否一致,不一致证明此闭括号无对应开括号,字符串非法。
最终栈为空则字符串满足要求,不为空则有不对应的括号存在。
class Solution {
public boolean isValid(String s) {
if ("".equals(s)) {
return true;
}
Stack<Character> stack = new Stack<Character>();
for (char c : s.toCharArray()) {
switch (c){
case ')':{
if (stack.isEmpty() || '(' != stack.pop()) {
return false;
}
break;
}
case '}': {
if (stack.isEmpty() || '{' != stack.pop()) {
return false;
}
}
break;
case ']': {
if (stack.isEmpty() || '[' != stack.pop()) {
return false;
}
break;
}
default:{
stack.push (c);
}
}
}
return stack.isEmpty();
}
}
2.简洁代码,同样利用栈,遇到开括号时直接在栈中存入对应的闭括号,遇到闭括号则直接判断和栈顶元素是否相同即可。
最终栈为空则字符串满足要求,不为空则有不对应的括号存在。
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.isEmpty()||c!=stack.pop()) { return false };
}
return stack.isEmpty();
}
}
2. 合并两个有序链表
题目描述:
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
题解:
1.创建一条新链表,一个一个对比两链表元素的大小,满足条件的元素放入新链表。(注意需要一个引用始终引用着新链表的头部,避免在合并过程中,头部引用丢失)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode newListNode = new ListNode();
// 新链表头的引用。合并过程中,newListNode引用会修改,header引用用于最后的返回。
ListNode header = newListNode;
// 两链表不为空时,比较元素大小,小的连接在新链表后,引用后移。
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
newListNode.next = l1;
l1 = l1.next;
} else {
newListNode.next = l2;
l2 = l2.next;
}
// 引用始终引用新链表的最后一个元素
newListNode = newListNode.next;
}
// 其中一条链表为空,则将另一条链表剩余元素连接在新链表后
if (l1 == null) {
newListNode.next = l2;
}
if (l2 == null) {
newListNode.next = l1;
}
return header.next;
}
}
有些地方表达的意思可能不是很准确还有可能存在错误,有问题请提出,感谢❤