输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解法1:循环,谁小连接谁,谁向后跑,总会有有一个链表先跑完,while循环直到有一个链表走到头,循环结束判断哪个链表有剩余,将剩余链表进行连接,注意特殊输入NULL以及不要丢失合并后链表的头(所以要定义两个指针,一个指针指向合并后的头,保持不动,最后返回;一个作为向前跑的指针,进行合并)。
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
{
return pHead2;
}
else if(pHead2 == NULL)
{
return pHead1;
}
ListNode * head = NULL;
ListNode * mergelist = NULL;
if(pHead1->val <= pHead2->val)
{
head = pHead1;
mergelist = pHead1;
pHead1 = pHead1->next;
}
else{
head = pHead2;
mergelist = pHead2;
pHead2 = pHead2->next;
}
while(pHead1 != NULL && pHead2 != NULL)
{
if(pHead1->val <= pHead2 ->val)
{
head->next = pHead1;
pHead1 = pHead1->next;
}
else
{
head->next = pHead2;
pHead2 = pHead2->next;
}
head = head->next;
}
if(pHead1 != NULL)
{
head->next = pHead1;
}
else{
head->next = pHead2;
}
return mergelist;
}
解法2:递归,分析哪个链表的头结点值小,哪个就是合并之后的头结点
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
{
return pHead2;
}
else if(pHead2 == NULL)
{
return pHead1;
}
ListNode* head = NULL;
if(pHead1->val < pHead2->val)
{
head = pHead1;
head->next = Merge(pHead1->next,pHead2);
}
else
{
head = pHead2;
head->next = Merge(pHead1,pHead2->next);
}
return head;
}