160. 相交链表
题目列表: LeetCode 热题 HOT 100
解法一
使用哈希集合(C++中是unordered_set,Java中是HashSet)存储链表 h e a d A headA headA 节点,判断 h e a d B headB headB 中的节点是否在哈希集合中。
- 时间复杂度: O ( m + n ) O(m+n) O(m+n),其中 m m m 和 n n n 是分别是链表 h e a d A headA headA 和 h e a d B headB headB 的长度。需要遍历两个链表各一次。
- 空间复杂度: O ( m ) O(m) O(m),其中 m m m 是链表 h e a d A headA headA 的长度。需要使用哈希集合存储链表 h e a d A headA headA 中的全部节点。
C++代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {unordered_set<ListNode *>set;ListNode *t = headA;while(t != nullptr){set.insert(t);t = t->next;}t = headB;while(t != nullptr){if(set.count(t)){return t;}t = t->next;}return nullptr;}
};
Java代码
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> set = new HashSet<ListNode>();ListNode temp = headA;while(temp != null){set.add(temp);temp = temp.next;}temp = headB;while(temp != null){if(set.contains(temp)){return temp;}temp = temp.next;}return null;}
}
解法二
相交链表(双指针,清晰图解)添加链接描述
C++代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *a = headA, *b = headB;while(a != b){a = (a != nullptr) ? a->next : headB;b = (b != nullptr) ? b->next : headA;}return a;}
};
Java代码
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode a = headA, b = headB;while(a != b){a = (a == null) ? headB : a.next;b = (b == null) ? headA : b.next;}return a;}
}
236. 二叉树的最近公共祖先
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == p || root == q || root == nullptr) return root;TreeNode *left = lowestCommonAncestor(root->left, p, q);TreeNode *right = lowestCommonAncestor(root->right, p, q);if(left != nullptr && right != nullptr) return root;else if(left != nullptr) return left;else if(right != nullptr) return right;return nullptr; }
};
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//if(root == p || root == q || root == null) return root;TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p ,q);if(left == null) return right;if(right == null) return left;return root;}
}
234. 回文链表
206. 反转链表
迭代或递归实现
C++版本
//迭代
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode *pre = nullptr, *now = head;while(now != nullptr){ListNode *next = now->next;now->next = pre;pre = now;now = next;}return pre;}
};
// 递归
class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr || head->next == nullptr) return head;ListNode *newhead = reverseList(head->next);head->next->next = head;head->next = nullptr;return newhead;}
};
Java版本
// 迭代
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;while(head != null){ListNode temp = head.next;head.next = pre;pre = head;head = temp;}return pre;}
}
// 递归
class Solution {public ListNode reverseList(ListNode head) {if(head == null || head.next == null) return head;ListNode newHead = reverseList(head.next);head.next.next = head;head.next = null;return newHead;}
}
回归本题
C++版本
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode *pre = nullptr, *now = head;while(now != nullptr){ListNode *next = now->next;now->next = pre;pre = now;now = next;}return pre;}bool isPalindrome(ListNode* head) {ListNode *slow = head, *quick = head;while(quick->next != nullptr){slow = slow->next;quick = quick->next;if(quick->next != nullptr) quick = quick->next;}ListNode *rear = reverseList(slow);ListNode *a = head, *b = rear;while(a != slow){if(a->val != b->val) return false;a = a->next;b = b->next;}return true;}
};
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;while(head != null){ListNode temp = head.next;head.next = pre;pre = head;head = temp;}return pre;}public boolean isPalindrome(ListNode head) {ListNode slow = head, quick = head;while(quick.next != null){slow = slow.next;quick = quick.next;if(quick.next != null) quick = quick.next;}ListNode rear = reverseList(slow), a = head, b = rear;while(a != slow){if(a.val != b.val) return false;a = a.next;b = b.next;}return true;}
}