看题:
1.未利用哨兵结点之前:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode* head=NULL,*tail=NULL;
if(l1->val<l2->val)
{
head=l1;
tail=head;
l1=l1->next;
}
else
{
head=l2;
tail=head;
l2=l2->next;
}
while(l1 && l2)
{
if(l1->val<l2->val)
{
tail->next=l1;
l1=l1->next;
}
else
{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;
}
if(l1==NULL)
{
tail->next=l2;
}
if(l2==NULL)
{
tail->next=l1;
}
return head;
}
2.利用哨兵结点后:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));//哨兵结点,可以省略去在两个链表里面找头的麻烦,在利用完之后,释放即可;
struct ListNode* tail=head;
while(l1 && l2)
{
if(l1->val<l2->val)
{
tail->next=l1;
l1=l1->next;
}
else
{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;
}
if(l1==NULL)
{
tail->next=l2;
}
if(l2==NULL)
{
tail->next=l1;
}
struct ListNode* realHead=head->next;//返回时真正的头为realHead
free(head);
return realHead;
}