题目链接:
题目描述:
解题思路:归并思想+链表尾插
1、不带哨兵位的头结点尾插
定义head和tail的指针,并指向空,两个有序链表从头结点位置开始比较值大小,较小的值尾插到新链表上。
代码实现:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if(list1==NULL)//这里解决出现空指针的问题 list1 【】list2【0】
return list2;
if(list2==NULL)
return list1;
struct ListNode* head,*tail;
head=tail=NULL;
while(list1&&list2)
{
if(list1->val<list2->val)
{
if(tail==NULL)
{
head=tail=list1;
list1=list1->next;
}
else
{
tail->next=list1;
tail=tail->next;
list1=list1->next;
}
}
else
{
if(tail==NULL)
{
head=tail=list2;
list2=list2->next;
}
else
{
tail->next=list2;
tail=tail->next;
list2=list2->next;
}
}
}
//销毁带哨兵位的头结点
if(list1)
tail->next=list1;
if(list2)
tail->next=list2;
return head;
}
按照思路编写,可能会遇到空指针问题
2、带哨兵位的头结点尾插
创建哨兵位的头结点,不存储有效数据,并用head和tail指针指向头节点,两个有序链表从头结点位置开始比较值大小,较小的值尾插到新链表上。
代码实现 :
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* head,*tail;
//创建哨兵位头结点
head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
tail->next=NULL;
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* del=head;
head=head->next;
free(del);
return head;
}