LeetCode热题100道-Day04

82 阅读1分钟

LeetCode热题100道-Day04

19. 删除链表的倒数第 N 个结点

  • 使用双指针解决问题,先定义了一个虚拟头节点dummy,dummy.next指向head,定义fast和slow指针,初始值为dummy。fas先走n + 1步,只有走n + 1步,后面同时移动时,slow才能移动到操作节点,也就是删除节点的前一个。fast和slow再同时移动,直到fast移到末尾,再删除目标节点。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
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;
    }
}

20. 有效的括号

  • 使用栈解决,先创建一个栈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;
    }
}

21. 合并两个有序链表

  • 使用了一个虚拟头节点的小技巧,使用虚拟头节点简化边界情况的处理,可以避免处理空指针的情况。比较 p1 和 p2 两个指针,将值较小的的节点接到 p 指针,被接的链表前进,p指针不断前进。如果p1或p2为空链表,则只需要考虑另外一条链表。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
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;
    }
}