leecode21.合并两个有序链表,牛客网答案有错
此代码是带有头节点的链表,容易出错的地方是头节点的处理。
mylist* mergeTwoLists(mylist* l1,mylist* l2)
{
cout<<"输入链表l1:";
printList(l1);
cout<<"输入链表l2:";
printList(l2);
if (l1==nullptr||l1->next==nullptr)
{
cout<<"返回l2:"<<endl;
printList(l2);
return l2;
}
if (l2==nullptr||l2->next==nullptr)
{
cout<<"返回l1:"<<endl;
printList(l1);
return l1;
}
//临时头节点
mylist *tmp=(mylist*)malloc(sizeof(mylist));
if (l1->next->value<l2->next->value)
{
tmp->next=l1->next->next;
l1->next->next=mergeTwoLists(tmp,l2)->next;
cout<<"合并返回l1:"<<endl;
printList(l1);
return l1;
}else
{
tmp->next=l2->next->next;
l2->next->next=mergeTwoLists(l1,tmp)->next;
cout<<"合并返回l2:"<<endl;
printList(l2);
return l2;
}
}
源代码:
// 146_合并两个有序链表.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct mylist
{
int value;
mylist *next;
};
//创建链表
mylist* CreateList()
{
mylist* head=NULL;
//1.创建头结点
head =(mylist*) malloc(sizeof(mylist));
if (head == nullptr)
{
cout<<"分配内存失败"<<endl;
return head;
}
int len;
cout<<"输入节点个数:"<<endl;
cin>>len;
int val;
mylist *ptail=head;
for (int i=0;i<len;i++)
{
cin>>val;
mylist* pnode=(mylist*)malloc(sizeof(mylist));
if (pnode==nullptr)
{
cout<<"分配内存失败:"<<i<<endl;
return nullptr;
}
pnode->value=val;
pnode->next=nullptr;
ptail->next=pnode;
ptail = pnode;
}
return head;
}
//打印链表
void printList(mylist *head)
{
if (head==nullptr)
{
return;
}
mylist *ptm=head->next;
while(ptm)
{
cout<<ptm->value<<" ";
ptm=ptm->next;
}
cout<<endl;
}
mylist* mergeTwoLists(mylist* l1,mylist* l2)
{
cout<<"输入链表l1:";
printList(l1);
cout<<"输入链表l2:";
printList(l2);
if (l1==nullptr||l1->next==nullptr)
{
cout<<"返回l2:"<<endl;
printList(l2);
return l2;
}
if (l2==nullptr||l2->next==nullptr)
{
cout<<"返回l1:"<<endl;
printList(l1);
return l1;
}
//临时头节点
mylist *tmp=(mylist*)malloc(sizeof(mylist));
if (l1->next->value<l2->next->value)
{
tmp->next=l1->next->next;
l1->next->next=mergeTwoLists(tmp,l2)->next;
cout<<"合并返回l1:"<<endl;
printList(l1);
return l1;
}else
{
tmp->next=l2->next->next;
l2->next->next=mergeTwoLists(l1,tmp)->next;
cout<<"合并返回l2:"<<endl;
printList(l2);
return l2;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
mylist* l1=CreateList();
printList(l1);
mylist* l2=CreateList();
printList(l2);
mylist*l3=mergeTwoLists(l1,nullptr);
printList(l3);
mylist*l4=mergeTwoLists(nullptr,l2);
printList(l4);
mylist*l5=mergeTwoLists(l1,l2);
printList(l5);
return 0;
}
参考文献: