将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
法一:
//取小的结点尾插到新链表
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 = tail = l1;
l1 = l1->next;
}
else
{
head = tail = l2;
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) //如果l1不为空,则把l1连接到tail指向的地址后面
{
tail->next = l1;
}
if(l2)
{
tail->next = l2;
}
return head;
}
法二:建设一个头结点
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = NULL,*tail = NULL;
//创建一个哨兵位的头结点
head = tail = (struct ListNode*) malloc(sizeof(struct ListNode));
tail->next = NULL;
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) //如果l1不为空,则把l1连接到tail指向的地址后面
{
tail->next = l1;
}
if(l2)
{
tail->next = l2;
}
struct ListNode* node = head;
head = head->next;
free(node);
return head;
}