【数据结构与算法 | 基础篇】[链表专题]力扣LCR077, 83

简介: 【数据结构与算法 | 基础篇】[链表专题]力扣LCR077, 83

1. LCR077 : 排序链表

题 :

给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
 
 
 
示例 1:
 
 
 
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:
 
 
 
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
 
输入:head = []
输出:[]
 
 
提示:
 
链表中节点的数目在范围 [0, 5 * 104] 内
-105 <= Node.val <= 105
 
 
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

解法1 : 借助辅助数组求解

思路 : 先一轮遍历,确定链表节点的个数,并使用辅助数组将链表节点的数据域记录下来,再遍历链表反向覆盖.该解法空间复杂度较高O(n),时间复杂度较低O(n).

解 :

class Solution {
    public ListNode sortList(ListNode head) {
        //如果是空链表, 或者链表只有一个节点时, 此时无需排序
        if (head == null || head.next == null) {
            return head;
        }
        int n = 0;
        ListNode temp = head;
        while (temp != null) {
            n++;
            temp = temp.next;
        }
        int[] arr = new int[n];
        temp = head;
        n = 0;
        while (temp != null) {
            arr[n++] = temp.val;
            temp = temp.next;
        }
        Arrays.sort(arr);
        temp = head;
        n = 0;
        while (temp != null) {
            temp.val = arr[n++];
            temp = temp.next;
        }
        return head;
    }
}

解法2 : 递归

思路 :

解 :

2. 力扣83 : 删除排序链表中的重复元素

题 :

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
 
 
 
示例 1:
 
 
输入:head = [1,1,2]
输出:[1,2]
示例 2:
 
 
输入:head = [1,1,2,3,3]
输出:[1,2,3]
 
 
提示:
 
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列

(1). 解法1 : 递归


思路 : 不断递,当递到最后一个节点时,返回最后一个节点,第一次归时,p指向了最后一个节点,head指向了p的上一个节点,如果二者相等,则删除p.返回head节点.


(2). 技巧 :

  • 在于该链表是升序排列的,所以比较相邻节点的大小.
  • 该链表的头节点不用删除,所以不用借助于哨兵节点.

(3). 解 :

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        //如果链表为空, 或者只有一个节点
        if (head == null || head.next == null) {
            return head;
        }
        ListNode p = deleteDuplicates(head.next);
        if (head.val == p.val) {
            head.next = head.next.next;
        }
        return head;
    }
}

(2). 解法2 : 递归

思路 : 如果head指向的节点和下一节点的val值相同,则返回head的下一节点的递归结果(相当于把自己删了).如果head指向的节点与下一节点的val值不相等,则返回head自己和其下一节点的递归结果.

解 :

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        if (head.val == head.next.val) {
            return deleteDuplicates(head.next);
        } else {
            head.next = deleteDuplicates(head.next);
            return head;
        }
    }
}

(3). 解法3 : 双指针

思路 : 使用快慢指针,如果fast指针指向的节点的值与其下一个节点相等,则需要删除fast指针指向的下一个节点.否则将fast指针指向下一个节点.循环直到slow指针指向null为止.

解 :

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode fast = head;
        ListNode slow;
        while ((slow = fast.next) != null) {
            if (fast.val == slow.val) {
                fast.next = fast.next.next;
            } else {
                fast = fast.next;
            }
        }
        return head;
    }
}
相关文章
|
18天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
31 1
|
3天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
24 4
|
4天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
4天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
3天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
13 0
|
17天前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
17 0
|
23天前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
23天前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
23天前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
15 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行