前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -21.合并两个有序链表 -83.删除排序链表中的重复元素】

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

作者头像
YoungMLet
发布2024-03-01 09:28:43
840
发布2024-03-01 09:28:43
举报
文章被收录于专栏:C++/LinuxC++/Linux

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;如图:

代码语言:javascript
复制
		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,如下图:

代码语言:javascript
复制
		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;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode-21.合并两个有序链表
  • Leetcode-83.删除排序链表中的重复元素
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档