剑指offer题目详细版本(1)

简介: 剑指offer题目详细版本(1)

一、链表题目


1、从尾到头打印链表


  • 使用栈(也可以使用数组,逆序输出)


/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        Stack<ListNode> stack = new Stack<>();
        while(listNode!=null){
            stack.push(listNode);
            listNode = listNode.next;
        }
        while(!stack.isEmpty()){
            list.add(stack.pop().val);
        }
        return list;
    }
}


  • 反转链表再打印

关键点:要注意画图

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
         ArrayList<Integer> list = new ArrayList<>();
        ListNode pre = null;   // 定义前驱节点
        ListNode cur = listNode; // 定义当前节点 
        while(cur!=null){
            ListNode next = cur.next;  // 定义后继节点
            cur.next = pre;   
            pre = cur;
            cur = next;
        }
        ListNode head = pre;
        while(head!=null){
            list.add(head.val);
            head = head.next;
        }
        return list;
    }
}


  • 递归打印链表

递归到链表的尾部,再依次将链表结点存入数组中

算法实现:

变量:先创建一个list数组

递归结束条件:当链表结点为null,listNode==null。

结果:list即为逆序排列链表数值后的数组


image.png


import java.util.ArrayList;
public class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
}


2、反转链表

通过三个指针轮流交替 的迭代方法


public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null || head.next == null){
           return head;
        }
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}


迭代方法


微信图片_20220129163834.gif


/**
     *递归实现单链表反转
     * @param list 为传入的单链表
     */
    public static Node recursiveList(Node list){
        // 如果链表为空 或者 链表中只有一个节点,直接返回
        // 也是递归结束的条件
        if (list == null || list.next == null) return list;
        Node recursive = recursiveList(list.next);
        // 将 list.next.next 指针指向当前链表 list
        list.next.next = list ;
        // 将 list.next 指针指向 null
        list.next = null;
        // 返回反转之后的链表 recursive
        return recursive;
    }


3、合并两个排序的链表

非递归 版本


/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode newHead = new ListNode(0);
        ListNode result = newHead;
        while(list1!=null&&list2!=null){
            if(list1.val>=list2.val){
                newHead.next = list2;
                list2 = list2.next;
            }else{
                newHead.next = list1;
                list1 = list1.next;
            }
            newHead = newHead.next;
        }
        if(list1!=null){
            newHead.next = list1;
        }
        if(list2!=null){
            newHead.next = list2;
        }
        return result.next;
    }
}
目录
相关文章
剑指offer题目汇总(三)
剑指offer题目汇总(三)
|
5月前
|
算法
剑指offer题目汇总(一)
剑指offer题目汇总(一)
剑指offer题目汇总(二)
剑指offer题目汇总(二)
剑指offer题目汇总(五)
剑指offer题目汇总(五)
剑指offer题目汇总(四)
剑指offer题目汇总(四)
|
6月前
LeetCode刷题之 存在重复元素(题目分析➕源代码)
LeetCode刷题之 存在重复元素(题目分析➕源代码)
|
11月前
LeetCode刷题集(七)(LeetCode70.爬楼梯)
LeetCode刷题集(七)(LeetCode70.爬楼梯)
61 0
|
存储
【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!
【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!
54 0
|
算法 Java 测试技术
14天刷爆LeetCode算法学习计划——Day01 二分查找(内含三道力扣真题)
如果我们规定整数的最大值只能是100的话,如果有个老六偏要设数组头和尾的值都是99的话,99+99=198 > 100,芭比Q了,这不就没办法运行程序了嘛,所以为了避免出现这种错误,只能用减法,由于数组的下标值是依次递增的,要想知道他的一半是多少的话,直接拿最大值-最小值的差除以2再加上最小值(一秒回到小学),即 mid = left + (right - left) / 2
162 0
14天刷爆LeetCode算法学习计划——Day01 二分查找(内含三道力扣真题)
代码随想录刷题|LeetCode 343. 整数拆分 96.不同的二叉搜索树
代码随想录刷题|LeetCode 343. 整数拆分 96.不同的二叉搜索树
代码随想录刷题|LeetCode 343. 整数拆分 96.不同的二叉搜索树