从链表1和链表2的头部选择一个小的节点插入到新节点中,new_head记录新链表的头部,new_tail记录新链表的尾部。第一个插入的节点就是new_head,每次插入都去更新new_tail。某一个链表结束以后,总有一个链表剩下某些节点,再进行遍历插入即可
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
//插入某个结点以后,下一次插入只可能是在已经插入的节点之后;
ListNode* new_head = NULL;
ListNode* new_tail = NULL;
//若节点pHead1为空则直接返回pHead2;
if(!pHead1)
{
return pHead2;
}
//若节点pHead2为空则直接返回pHead1;
if(!pHead2)
{
return pHead1;
}
ListNode* p = pHead1;
ListNode* q = pHead2;
while(p && q)
{
//将较小的插入到最前面;
if(p->val < q->val)
{
//临时保存下一个节点;
ListNode* tmp = p->next;
//获取头节点;
if(!new_head)
{
new_head = p;
new_tail = new_head;
}else
{
//将当前节点p插入到尾节点后面;
new_tail = insert(new_tail,p);
}
//节点p指向下一个节点;
p = tmp;
}else
{
//临时保存下一个节点;
ListNode* tmp = q->next;
//获取头节点;
if(!new_head)
{
new_head = q;
new_tail = new_head;
}else
{
//将当前节点q插入到尾节点后面;
new_tail = insert(new_tail,q);
}
//节点q指向下一个节点;
q = tmp;
}
//尾节点的下一个节点为空;
new_tail->next = NULL;
}
//节点p的最大值比q大,所以链表p有剩余;
while(p)
{
ListNode* tmp = p->next;
new_tail = insert(new_tail,p);
p = p->next;
}
//节点q的最大值比p大,所以链表q有剩余;
while(q)
{
ListNode* tmp = q->next;
new_tail = insert(new_tail,q);
q = q->next;
}
return new_head;
}
//将节点p_node插入到链表尾部并返回更新后的链表尾;
ListNode* insert(ListNode* tail, ListNode* p_node)
{
//如果尾节点为空,则直接赋值;
if(!tail)
{
tail = p_node;
}
else
{
//向尾节点追加新的节点,并更新尾节点;
tail->next = p_node;
tail = tail->next;
}
//返回新的尾节点;
return tail;
}
};
京公网安备 11010502036488号