原题链接: 合成两个有序链表.
题目:
难度:
解析:
先创建一个哨兵位的节点,用来连接下来进行连接l1和l2的节点
如果l1指针指向的节点小于l2指针指向的节点,那么l1指针指向的节点连接在新链表的后面,并且l1的指针走一步;
否则l2指针指向的节点连接新链表的后面,l2的指针走一步;
循环条件是l1,l2都不为NULL
当有其中有一个是NULL,则跳出循环,并且将剩下的链表连接到新链表
最后将guard这个节点销毁掉,返回新链表的第一节点:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL)//如果l1为空,则返回l2
{
return l2;
}
if(l2==NULL)
{
return l1;
}
struct ListNode* guard=NULL;
struct ListNode* tail=NULL;
guard=tail=(struct ListNode*)malloc(sizeof(struct ListNode));//创建哨兵位节点
while(l1&&l2)
{
if(l1->val<l2->val)//连接l1的节点
{
tail->next=l1;
l1=l1->next;
}
else//连接l2的节点
{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;
}
if(l1==NULL)//连接剩下的节点
{
tail->next=l2;
}
if(l2==NULL)
{
tail->next=l1;
}
struct ListNode* head=guard->next;
free(guard);//销毁哨兵位
guard=NULL;
return head;//返回第一个节点
}