LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历

简介: 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

反转链表Ⅱ



反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。


说明:


1 ≤ m ≤ n ≤ 链表长度。


示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4

输出: 1->4->3->2->5->NULL


分析:


这种题实现的方法可能比较多,但是我这里使用头插法去实现。m-n范围内进行反转,那么只需要将这部分的链表顺序头插在m-1位的后面即可。后面再拼接起来。


防止m包含头部,可以引入一个头节点进行处理。在具体的处理上可能有点繁琐,因为头插的时候遍历这个节点插入要改变结构,要在插入前将后侧nextNode存储下来下次使用。


20201227183005564.png


具体实现代码为:


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode value=new ListNode(0);//头节点
    value.next=head;
    ListNode team=value;//临时节点
    int index=1;//记录标记
    while (index<m) {
      team=team.next;
      index++;
    }
    //team 后面需要头插
    ListNode tail=team.next;//m节点,最后会在最后
    ListNode node=team.next;
    while (index<=n) {
      ListNode nextNode=node.next;//先储存右侧节点
      node.next=team.next;//插入第一步。将自己右侧指向
      team.next=node;//插入第二步,前面team指过来
      node=nextNode;
            index++;
    }
    tail.next=node; //逆置的链表和后面节点连接
    return value.next;
    }
}


复原ip地址



给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。


有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。


例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。


示例 1:


输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]


示例 2:


输入:s = "0000"
输出:["0.0.0.0"]


示例 3:


输入:s = "1111"
输出:["1.1.1.1"]


示例 4:


输入:s = "010010"
输出:["0.10.0.10","0.100.1.0"]


示例 5:


输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]


提示:


0 <= s.length <= 3000
s 仅由数字组成


分析


本题的话是一种典型的回溯算法,不过这题剪枝的方法非常重要,否则会产生很多不必要的计算。


不考虑其他条件,其实就是要枚举所有的划分方式,然后分成4份、每个数字满足条件,且刚好用完所有数字。而本题设计递归函数的时候,可以带上当前index和当前数字数量进行向下递归,且向下的时候要注意数字大小在0-255且0不能做其他数字前缀。另外还可以进行其他剪枝(从字符剩余数量判断能否组成答案每位1-3位)。


20201227184738421.png


具体代码为:


class Solution {
  public List<String> restoreIpAddresses(String s) {
    List<String>list=new ArrayList<String>();
    List<String>value=new ArrayList<String>();
    char ch[]=s.toCharArray();
    dfs(value,list,ch,0,0);
    return value;
    }
  private void dfs(List<String> value, List<String> list, char[] ch, int index, int num) {
    // TODO Auto-generated method stub
    if(num==4&&index==ch.length)
    {
      StringBuilder sBuilder=new StringBuilder();
      sBuilder.append(list.get(0));
      for(int i=1;i<4;i++)
      {
        sBuilder.append('.');
        sBuilder.append(list.get(i));
      }
      value.add(sBuilder.toString());
    }
    else if(num==4||index>=ch.length) return;
    else {
      if((4-num)*3<ch.length-index-1||ch.length-index<4-num)//剩下的已经不可能
      {
        return;
      }
      else if (ch[index]=='0') {
        list.add("0");
        dfs(value, list, ch, index+1, num+1);
                list.remove(list.size()-1);
      }
      else {
        StringBuilder sBuilder=new StringBuilder();
        for(int i=0;i<3&&index+i<ch.length;i++)
        {
          sBuilder.append(ch[index+i]);
          if(i==2&&Integer.parseInt(sBuilder.toString())>255)
            return;
          list.add(sBuilder.toString());
          dfs(value, list, ch, index+i+1, num+1);
          list.remove(list.size()-1);
        }
      }
    }
  }
}


二叉树的中序遍历



示例 1:


输入:root = [1,null,2,3]
输出:[1,3,2]


示例 2:


输入:root = []
输出:[]


示例 3:


输入:root = [1]
输出:[1]


示例 4:


输入:root = [1,2]
输出:[2,1]


示例 5:


输入:root = [1,null,2]


提示:


树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100


分析


中序遍历可以看这篇:数据结构与算法—二叉树的层序、前序中序后序(递归、非递归)遍历


上代码:


/**
 * 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<Integer> inorderTraversal(TreeNode root) {
    List<Integer>value=new ArrayList<Integer>();
    dfs(root,value);
    return value;
  }
   private void dfs(TreeNode root, List<Integer> value) {
    // TODO Auto-generated method stub
     if(root==null)
       return;
     dfs(root.left, value);
     value.add(root.val);
     dfs(root.right, value);  
  }
}


原创不易,bigsai请你帮两件事帮忙一下:


star支持一下, 您的肯定是我在平台创作的源源动力。


微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。


记得关注、咱们下次再见!


目录
相关文章
|
22天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
22天前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
22天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
22天前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
22天前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
10天前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
22天前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历
|
22天前
|
算法
LeetCode第93题复原 IP 地址
文章介绍了LeetCode第93题"复原 IP 地址"的解法,利用回溯算法和剪枝技术,通过树形图分析求解过程,实现了将字符串分割成满足IP地址段要求的子段,并验证每个子段是否有效。
LeetCode第93题复原 IP 地址
|
22天前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
22天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表