2024年最新单链表刷题常用技巧——构造哨兵位_链表 哨兵(1),2024年最新阿里巴巴发布“限量版”C C++零基础宝典

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

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

**示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

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



### 思路及图解


![](https://img-blog.csdnimg.cn/4b2327e3b6544f8b9bd5d4a5a5dcf874.png)


  将两个链表的节点逐个比较,小的尾插到新链表的后面,每次尾插完,新链表和较小值的链表的指针都要向前走,有一个为空就停止循环,最后再将那个不为空的链表节点全部尾插到新链表。


### 需要额外注意的问题



> 
> **要考虑一个链表为空的情况**
> 
> 
> **因为要尾插到新链表,所以要额外开辟一个哨兵位的空间,可以方便连续尾插,因为这样就可以不用改变头指针的指向。**
> 
> 
> **要及时释放哨兵位的空间**
> 
> 
> **在循环结束后要将没有遍历结束的链表继续尾插到新链表后面**
> 
> 
> 


#### 核心代码



struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode *head,tail;
head=tail=(struct ListNode
)malloc(sizeof(struct ListNode));
if(list1NULL)
return list2;
if(list2
NULL)
return list1;
while(list1&&list2)
{
if(list1->valval)
{
tail->next=list1;
list1=list1->next;
tail=tail->next;
}
else
{
tail->next=list2;
list2=list2->next;
tail=tail->next;
}
}
while(list1)
{
tail->next=list1;
list1=list1->next;
tail=tail->next;
}
while(list2)
{
tail->next=list2;
list2=list2->next;
tail=tail->next;
}
struct ListNode *del=head->next;
free(head);
return del;
}


## 链表分割


现有一链表的头指针 ListNode\* **pHead**,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。


  如图,给定的链表为 4-5-3-1-2-7 ,给一定值为 3,分割后的值为 1-2-4-5-3-7


![](https://img-blog.csdnimg.cn/860f63f869c1494da083c5d9aa9bcf8a.png)


### 思路及图解


  创建两个带哨兵位的链表,分别存放值小于x的节点和值大于x的节点,将数据全部存放在这两个新链表之后,再将小于 x 的那个链表的尾节点指向 大于 x 的那个链表的第一个有效节点,最后将大于 x 的链表的尾节点的 next 置空。


![](https://img-blog.csdnimg.cn/13f0f70f6cd1466e86e43f4dfc2e6ba5.png)


![](https://img-blog.csdnimg.cn/2341cd68a2074e499ae187b25c41c567.png)


#### 核心代码



class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
ListNode*tail2,*cur2,tail1,cur1;//哨兵位
tail1=cur1=(ListNode
)malloc(sizeof(ListNode));//小于x的
tail2=cur2=(ListNode
)malloc(sizeof(ListNode));//大于x的
while(pHead)
{
if(pHead->val<x)
{
cur1->next=pHead;
cur1=cur1->next;
}
else
{
cur2->next=pHead;
cur2=cur2->next;
}
pHead=pHead->next;
}
cur1->next=tail2->next;
cur2->next=NULL;
ListNode *del=tail1->next;
free(tail1);
free(tail2);
return del;
}
};




![img](https://img-blog.csdnimg.cn/img_convert/60bc2a37552be1f863e229a8d15f4e9a.png)
![img](https://img-blog.csdnimg.cn/img_convert/e784c4ec8f30a12843cb7c110d07769a.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值