链表
1. 检测链表中是否存在环
问题:给你一个链表,如何通过O(1)的空间复杂度检测链表中是否存在环。
LeetCode地址:https://leetcode.com/problems/linked-list-cycle/
解题思路:使用两个指针slow和fast,slow每次向前走一步,fast每次向前走两步,如果slow和fast相遇,则表明链表中有环,否则链表中没有环。
代码实现:/src/main/java/leetcode/linkedlist/_141_LinkedListCycle.java
2. 反转一个单链表
问题:反转一个单链表
LeetCode地址:https://leetcode.com/problems/reverse-linked-list/
解题思路:初始化两个节点pre(前一个结点)和curr(当前结点),pre指向null,curr指向链表头结点。遍历链表,首先将链表头节点指向pre,也就是指向null,之后pre和curr每次都向后移动一个结点,并将curr的next指针指向pre,直到遍历完整个链表为止。
代码实现:/src/main/java/leetcode/linkedlist/_206_ReverseLinkedList.java
3. 合并两个有序链表
问题:合并两个有序链表,并返回新链表。
LeetCode地址:https://leetcode.com/problems/merge-two-sorted-lists/
解题思路:因为两个链表都是有序,所以我们只需要从链表的头结点开始,依次在两个链表中拿出一个结点l1和l2,并比较两个结点值的大小,如果l1的值小于等于l2的值,那么就把l1的next指针指向l2,否则就把l2的next指针指向l1。为了实现O(1)的空间复杂度,推荐使用递归的方式。
代码实现: /src/main/java/leetcode/linkedlist/_21_MergeTwoSortedLists.java