您现在的位置是:首页 >技术交流 >【力扣-21】合并两个有序链表网站首页技术交流
【力扣-21】合并两个有序链表
简介【力扣-21】合并两个有序链表
🖊作者 : Djx_hmbb
📘专栏 : 数据结构
😆今日分享 : 英文文章里 : TL;DR 或者 tl;dr。
网上英文解释有两种,一种是Too long;Don’t read,另一种是Too long;Didn’t read。意思是:“文章太长了,读不下去了”。
文章目录
✔题目链接;
✔题目:
✔解题思路:
:>不用头结点–依次比较每个节点的大小
创建的 指针 : 新链表的头指针,比较节点大小的当前指针,next指针.
:> 使用头结点–依次比较每个节点的大小
创建的指针 :
✔代码详情;
🔎不用头结点
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* p1 = list1;
struct ListNode* p2 = list2;
struct ListNode* newNode = NULL,*cur = newNode;
//如果链表1为空时,返回链表2
if (list1 == NULL) {
return list2;
}
//如果链表2为空时,返链表1
if (list2 == NULL) {
return list1;
}
//判断当前节点是否为空,为空时则结束查找比较
while (p1 && p2) {
struct ListNode* next1 = p1->next;
struct ListNode* next2 = p2->next;
//判断新链表的头结点是否为空
//头结点为空
if (newNode == NULL) {
//取小值进行尾插
if (p1->val < p2->val) {
cur = newNode = p1;
p1 = next1;
if (next1)
next1 = next1->next;
}
else {
cur = newNode = p2;
p2 = next2;
if (next2)
next2 = next2->next;
}
}
//头结点不为空
else {
if (p1->val < p2->val) {
cur->next = p1;
cur = p1;
p1 = next1;
if (next1)
next1 = next1->next;
}
else {
cur->next = p2;
cur = p2;
p2 = next2;
if (next2)
next2 = next2->next;
}
}
}
//判断是哪一个链表先为空的,将不为空的链接到新链表中
if (p1 == NULL) {
cur->next = p2;
}
else if (p2 == NULL) {
cur->next = p1;
}
//返回
return newNode;
}
🔎用头结点
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1 == NULL)
return l2;
else if(l2 == NULL)
return l1;
struct ListNode* head = NULL, *tail = NULL;
//创建空链表
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next = NULL;
while(l1 && l2)
{
// 取小的进行尾插
if(l1->val < l2->val)
{
tail->next = l1;
tail = tail->next;
l1 = l1->next;
}
else
{
tail->next = l2;
tail = tail->next;
l2 = l2->next;
}
}
//剩余元素直接拼接
if(l1)
tail->next = l1;
else
tail->next = l2;
struct ListNode* list = head->next;
free(head);
return list;
}
📖总结 :
带头结点的好处 :
- 不用考虑新的链表头指针是否为空的情况(代码更简短) .
不带头节点的好处 :
- 考试基本都是不带头节点的情况 , 这样更有利于我们思维训练 .
感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!
家人们,点个再走呗~
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。