Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
方法一、递归的方法
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL) return l2;
else if(l2 == NULL) return l1;
ListNode *pNewHead = NULL;
if(l1->val < l2->val){
pNewHead = l1;
pNewHead->next = mergeTwoLists(l1->next,l2);
}
else {
pNewHead = l2;
pNewHead->next = mergeTwoLists(l1,l2->next);
}
return pNewHead;
}
方法二、多开辟了一个链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(NULL == l1 || NULL == l2)
{
return (NULL==l1)?l2:l1;
}
ListNode l3(0); //必须使用这种定义,如果写成ListNode* l3会超时,必须带头节点
ListNode* p1;
ListNode* p2;
ListNode* p3;
p1 = l1;
p2 = l2;
p3 = &l3;
while(p1 && p2)
{
ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
if(p1->val <= p2->val)
{
cout<<"1p1 "<<p1->val<<endl;
tmp->val = p1->val;
tmp->next = NULL;
p1 = p1->next;
}
else
{
cout<<"1p2 "<<p2->val<<endl;
tmp->val = p2->val;
tmp->next = NULL;
p2 = p2->next;
}
p3->next = tmp;
p3 = tmp;
}
while(p1)
{
cout<<"2p1"<<p1->val<<endl;
ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
tmp->val = p1->val;
tmp->next = NULL;
p3->next = tmp;
p3 = tmp;
p1 = p1->next;
}
while(p2)
{
cout<<"2p2"<<p2->val<<endl;
ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
tmp->val = p2->val;
tmp->next = NULL;
p3->next = tmp;
p3 = tmp;
p2 = p2->next;
}
return l3.next; //因为带头节点所以必须返回l3.next
}
方法三、直接在第一个链表上进行修改,最终返回第一个链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(NULL == l1 || NULL == l2)
{
return (NULL==l1)?l2:l1;
}
ListNode* p1= l1;
ListNode* pre = p1;
ListNode* p2 = l2;
while(p1 && p2)
{
ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
if(p1->val <= p2->val)
{
pre = p1;
p1 = p1->next;
}
else
{
if(pre == p1) //注意当pre==p1时表示要将p2的节点插入p1的头节点
{
tmp->val = p2->val;
tmp->next = pre;
pre = tmp;
l1 = pre;
p2 = p2->next;
}
else
{
tmp->val = p2->val;
pre->next = tmp;
tmp->next = p1;
p2 = p2->next;
pre = tmp;
}
}
}
while(p2)
{
ListNode* tmp = (ListNode*)malloc(sizeof(ListNode));
tmp->val = p2->val;
tmp->next = NULL;
pre->next = tmp;
pre = tmp;
p2 = p2->next;
}
return l1;
}