【力扣-21】合并两个有序链表
🖊作者 : Djx_hmbb
📘专栏 : 数据结构
😆今日分享 : 英文文章里 : TL;DR 或者 tl;dr。
网上英文解释有两种,一种是Too long;Don’t read,另一种是Too long;Didn’t read。意思是:“文章太长了,读不下去了”。
文章目录
✔题目链接;
【力扣-21】合并两个有序链表
✔题目:
✔解题思路:
:>不用头结点–依次比较每个节点的大小
创建的 指针 : 新链表的头指针,比较节点大小的当前指针,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为空时,返回链表2if (list1 == NULL) {return list2;}//如果链表2为空时,返链表1if (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;elsetail->next = l2;struct ListNode* list = head->next;free(head);return list;
}
📖总结 :
带头结点的好处 :
- 不用考虑新的链表头指针是否为空的情况(代码更简短) .
不带头节点的好处 :
- 考试基本都是不带头节点的情况 , 这样更有利于我们思维训练 .
感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!