
【力扣 Hot100】 刷题日记
重排链表
重排链表
/**
* 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 void reorderList(ListNode head) {
if(head == null) return;
ListNode node = head;
ArrayList<ListNode> list = new ArrayList<>();
while(node != null){
list.add(node);
node = node.next;
}
int l = 0;
int r = list.size() - 1;
while(l < r){
list.get(l).next = list.get(r); //当前节点的下一个节点为尾节点
l++;
if(l == r) break;//防止偶数长度成环
list.get(r).next = list.get(l);
r--;
}
list.get(l).next = null; //l=r时,当前节点为重排后的尾节点,需要next置为null
}
}
/**
* 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 void reorderList(ListNode head) {
ListNode mid = middle(head);
ListNode head2 = reverseList(mid);//head2现在是反转链表之后的起点节点
//交叉链到链表
//假设5,中点为3,3的next应该为null,head和head2同时指向3,
while(head2.next != null){
ListNode nxt = head.next;
ListNode nxt2 = head2.next;
head.next = head2;//3.next=3,自己成环
head2.next = nxt;
head = nxt;
head2 = nxt2;
}
}
//反转链表
public ListNode reverseList(ListNode head) {
ListNode pre = null, cur = head;
while (cur != null) {
ListNode nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
//获取链表中点
//快指针一次走两步,慢指针一次一步,快指针走完链表刚好满指针在中点
public ListNode middle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
二叉树的锯齿形层序遍历
二叉树的锯齿形层序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> ans = new ArrayList<>();
if(root != null) queue.add(root);
while(!queue.isEmpty()){
List<Integer> tmp = new ArrayList<>();
for(int i = queue.size(); i > 0; i--){
TreeNode node = queue.poll();
tmp.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
if(ans.size() % 2 == 1) Collections.reverse(tmp);
ans.add(tmp);
}
return ans;
}
}
二叉树的层序遍历
二叉树的层序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> ans = new ArrayList<>();
if(root != null) queue.add(root);
while(!queue.isEmpty()){
List<Integer> tmp = new ArrayList<>();
for(int i = queue.size(); i > 0; i--){
TreeNode node = queue.poll();
tmp.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
ans.add(tmp);
}
return ans;
}
}
