方法1: 采用递归的思想
(1)先确定合成的新链表的头节点
(2) 再合并剩下的节点
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr)
return pHead2;
if(pHead2==nullptr)
return pHead1;
//判断节点大小,取小节点(要删除的节点)
ListNode* cur=pHead1->val<pHead2->val?
pHead1:pHead2;
//移动被删除的原始链表的指针
if(cur==pHead1)
pHead1=pHead1->next;
else
pHead2=pHead2->next;
cur->next=Merge(pHead1, pHead2);
return cur;
}
方法2: 一个一个节点归并
(1)先比较两个链表的头部节点大小
(2)把小的节点从原始链表中取出
(3)移动删除节点的原始链表的指针
(4)将取出的节点尾插到新链表的尾部
(5)重复上述
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==nullptr)
return pHead2;
if(pHead2==nullptr)
return pHead1;
ListNode* head=nullptr;//新链表的头节点
ListNode* tail=nullptr;//新链表的尾节点
while(pHead1&&pHead2)
{
//判断节点大小,取小节点(要删除的节点)
ListNode* cur=pHead1->val<pHead2->val?
pHead1:pHead2;
//移动被删除的原始链表的指针
if(cur==pHead1)
pHead1=pHead1->next;
else
pHead2=pHead2->next;
//尾插到新链表中
//当新链表为空时,尾插
if(head==nullptr)
{
head=cur;
tail=cur;
}
else
{
tail->next=cur;
tail=cur;
}
}
//循环结束后,将非空链表尾插到新链表的后面
if(pHead1==nullptr)
{
tail->next=pHead2;
}
else
{
tail->next=pHead1;
}
return head;
}