题目描述
思路:创建一个新的链表,依次比较两个有序链表中的元素,把小的节点尾插到新链表中,若有一个链表已经为空,说明合并完成,返回新链表的头结点
第一步:创建新的头节点,并用tail标记新链表的尾节点
第二步:依次比较两个链表的节点,取小的尾插(若一样大,则随便取一个)
说明:下面蓝色横线代表要比较的两个节点
到此,第一个链表已经为空,接下来的工作就是把不为空的那个链表链接到新链表的后面即可
代码初步实现:
只要有一个链表为空就应该跳出循环,因此while条件是 list1 && list2
但是这段代码直接提交上去是有问题的
这类问题我们已经见到过很多次了,就是空指针解引用导致报错,看下题目给的测试用例就会发现,当其中一个链表为空的时候,while循环压根没有进去,直接来到了最后把非空链表拼接到新链表的代码处
此时tail还是空指针,因此就会报错
所以我们在进入while循环之前处理一下其中一个链表为空的情况:
其中一个链表为空,直接返回第二个链表即可
这样就通过啦
正确代码:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
if(list1 == NULL)
{
return list2;
}
if(list2 == NULL)
{
return list1;
}
while (list1 && list2)
{
if (list1->val < list2->val)
{
if (tail == NULL)
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = list1;
}
list1 = list1->next;
}
else
{
if (tail == NULL)
{
tail = head = list2;
}
else
{
tail->next = list2;
tail = list2;
}
list2 = list2->next;
}
}
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail->next = list2;
}
return head;
}
好了,有序链表的合并就讲解到这了,欢迎大家交流指正~~~