1°题目链接
2°思路
思路1:
不开辟哨兵位的头结点
思路2:
开辟哨兵位的头结点
两种都可以
不开辟就是你要先把两个链表的第一个数据中取一个小的先放到头部再往下走
开辟可以直接往下走 但最后需要释放
两个链表从第一个数据开始比较
循环遍历两个链表
谁小谁先存 先存的那个链表要接着往下走 同时存的也往下走
最后谁先存完了 另一个链表存到后面
用一个指针初始化头指针往下走
因为最后要返回头部 直接用头指针走就找不到头部了
3°实现
不开辟哨兵位的头结点
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* head = NULL, * tail = NULL;
//如果其中一个链表为空 返回另一个
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
//先取一个小的等于第一个
if (list1->val < list2->val)
{
head = tail = list1;
list1 = list1->next;
}
else
{
head = tail = list2;
list2 = list2->next;
}
while (list1 && list2)
{
if (list1->val < list2->val)
{
tail->next = list1;
tail = tail->next;
list1 = list1->next;
}
else
{
tail->next = list2;
tail = tail->next;
list2 = list2->next;
}
}
//当一个为空的时候
//直接把另一个剩下的部分放到tail后面
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail->next = list2;
}
return head;
}
开辟哨兵位的头结点
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* head = NULL, * tail = NULL;
//如果其中一个链表为空 返回另一个
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
//哨兵位的头节点 开辟一个不存数据的头
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
while (list1 && list2)
{
if (list1->val < list2->val)
{
tail->next = list1;
tail = tail->next;
list1 = list1->next;
}
else
{
tail->next = list2;
tail = tail->next;
list2 = list2->next;
}
}
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail->next = list2;
}
//先存 后释放
//先释放 会有野指针问题
struct ListNode* list = head->next;
free(head);
//head是带头的 不是链表的头 返回head的下一个
return list;
}
4°运行结果
#10合并两个有序链表#完