【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】

简介: 【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】

Leetcode-21.合并两个有序链表

题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:l1 = [1, 2, 4], l2 = [1, 3, 4]

输出:[1, 1, 2, 3, 4, 4]

示例 2:

输入:l1 = [], l2 = []

输出:[]

示例 3:

输入:l1 = [], l2 = [0]

输出:[0]

我们的思路是,先定义两个结构体的空指针head和tail,然后先第一次比较list1和list2,谁小就把它的头节点赋给head和tail,然后更新list1或者list2;如图:

然后进入循环进行比较,当list1和list2都为非空,就进入循环,比较list1和list2谁小,假如list1小就把它放到tail的next,然后更新tail,更新list1;list2也同理;直到其中有一个空,就把另外一个非空的直接链接上tail的next;如图:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
    {
        //list1和list2其中一个链表为空,返回另外一个
        if (list1 == NULL)
        {
            return list2;
        }
        else if (list2 == NULL)
        {
            return list1;
        }
        //定义两个结构体的指针
        struct ListNode* head = NULL;
        struct ListNode* tail = NULL;
        //首先第一次比较,比较list1和list2谁小,就把这个头节点赋给head和tail
        if (list1->val < list2->val)
        {
            head = tail = list1;
            list1 = list1->next;
        }
        else
        {
            head = tail = list2;
            list2 = list2->next;
        }
        //当list1和list2都不为空,循环继续
        while (list1 && list2)
        {
            //开始逐一比较,假如list1小就把它放到tail的next,然后更新tail,更新list1
            if (list1->val < list2->val)
            {
                tail->next = list1;
                tail = tail->next;
                list1 = list1->next;
            }
            //list2小或者等于就把它放到tail的next,然后更新tail,更新list2
            else
            {
                tail->next = list2;
                tail = tail->next;
                list2 = list2->next;
            }
        }
        //直到其中有一个空,就把另外一个非空的直接链接上tail的next
        if (list1 == NULL)
        {
            tail->next = list2;
        }
        else
        {
            tail->next = list1;
        }
        return head;
    }

Leetcode-83.删除排序链表中的重复元素

题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。

示例 1:

输入:head = [1, 1, 2]

输出:[1, 2]

示例 2:

输入:head = [1, 1, 2, 3, 3]

输出:[1, 2, 3]

我们的思路是,定义两个指针,寻找重复的元素,当两个指针指向的元素相等,就将第一个先出现的指向第二次出现的next,如下图:

struct ListNode* deleteDuplicates(struct ListNode* head)
    {
        //head为空指针,返回空指针
        if (head == NULL)
        {
            return NULL;
        }
        //定义cur和del指针,cur从头开始,del从cur的next开始
        struct ListNode* cur = head, * del = head->next;
        //当del不为空
        while (del)
        {
            //当cur的val等于del的val,即出现了重复元素
            if (cur->val == del->val)
            {
                //将del的next赋给cur的next,即cur指向了del的next
                cur->next = del->next;
                //更新del
                del = del->next;
            }
            //当cur的val不等于del的val,即不是重复元素
            else
            {
                //更新cur和del
                cur = cur->next;
                del = del->next;
            }
        }
        return head;
    }
目录
相关文章
|
4月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
51 1
|
4月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
65 0
Leetcode第21题(合并两个有序链表)
|
4月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
38 0
Leetcode第三十三题(搜索旋转排序数组)
|
4月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
43 0
LeetCode第二十四题(两两交换链表中的节点)
|
4月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
54 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
4月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
66 0
|
4月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
47 0
|
4月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
121 0
|
5月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
6月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
146 2