题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解答一:
思想:利用无头链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
// 判断其中一个链表为空,返回另外一个
if(l1==NULL || l2==NULL)
return l1==NULL ? l2 : l1;
struct ListNode* cur1,*cur2,*newHead,*newTail;
newHead=newTail=NULL;
// 确定头节点
if(l1->val <= l2->val)
{
newHead=newTail=l1;
l1=l1->next;
}
else
{
newHead=newTail=l2;
l2=l2->next;
}
cur1=l1;
cur2=l2;
while(cur1 && cur2)
{
if(cur1->val<=cur2->val)
{
newTail->next=cur1;
newTail=cur1;
cur1=cur1->next;
}
else
{
newTail->next=cur2;
newTail=cur2;
cur2=cur2->next;
}
}
// 判断两个链表是否还有剩余
if(cur1)
newTail->next=cur1;
if(cur2)
newTail->next=cur2;
return newHead;
}
解答二:
思想:利用有头链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
// 判断其中一个链表为空,返回另外一个
if(l1==NULL || l2==NULL)
return l1==NULL ? l2 : l1;
struct ListNode* cur1,*cur2,*newHead,*newTail;
// 头结点没有数据
newHead=newTail=(struct ListNode*)malloc(sizeof(struct ListNode));
cur1=l1;
cur2=l2;
while(cur1 && cur2)
{
if(cur1->val<=cur2->val)
{
newTail->next=cur1;
newTail=cur1;
cur1=cur1->next;
}
else
{
newTail->next=cur2;
newTail=cur2;
cur2=cur2->next;
}
}
// 判断两个链表是否还有剩余
if(cur1)
newTail->next=cur1;
if(cur2)
newTail->next=cur2;
// 释放开辟的空间
// 注:头节点为空,有效数据是头节点的下一个
struct ListNode* Head=newHead->next;
free(newHead);
return Head;
}