2020.02.25
21. 合并两个有序链表
#include <iostream>
#include <math.h>
#include<algorithm>
using namespace std;
#define StackInitSize 100
#define MaxSize 100;
//链表
typedef int ElementType;
typedef struct LNode{
ElementType data;
struct LNode *next;
}Linklist;
Linklist *Init()//输入链表长度
{
Linklist *p=(Linklist*)malloc(sizeof(Linklist));//创建一个头结点
Linklist *temp=p;//指针temp指向头结点用于遍历链表
do{
Linklist *a=(Linklist*)malloc(sizeof(Linklist));
cin>>a->data;
a->next=NULL;
temp->next=a;
temp=temp->next;
}while(getchar()!='\n');
return p;
}
void display(Linklist *p)
{
Linklist *temp=p;
while(temp->next)
{
temp=temp->next;
cout<<temp->data<<" ";
}
cout<<endl;
}
int selectElm(Linklist *p,ElementType elem)//找出elem元素的位置
{
Linklist *t=p;
int i=1;
while(t->next)
{
t=t->next;
if(t->data==elem)
{
return i;
}
i++;
}
return -1;
}
//-----
/*
Linklist *change_elem(Linklist *p,int pos,ElementType elem)
{
Linklist *temp=p;
temp=temp->next;//temp指向首元素结点
for(int i=0;i<pos;i++)
{
temp=temp->next;
}
temp->data=elem;
return p;
}
*/
//------insert
Linklist *insert_elem(Linklist *p,ElementType elem,int add)
{
Linklist *temp=p;
for(int i=0;i<add;i++)
{
if(temp==NULL)
{
cout<<"插入位置无效\n";
}
temp=temp->next;
}
Linklist *c=(Linklist *)malloc(sizeof(Linklist));
c->data=elem;
c->next=temp->next;
temp->next=c;
return p;
}
Linklist *delete_elm(Linklist *p,int pos)
{
Linklist *temp=p;
for(int i=0;i<pos;i++)
{
temp=temp->next;
}
Linklist *c=temp->next;
temp->next=temp->next->next;
free(c);
return p;
}
Linklist *teil(Linklist *p,ElementType elem)
{
Linklist *temp=p;
while(temp->next)
{
temp=temp->next;
}
Linklist *c=(Linklist*)malloc(sizeof(Linklist));
c->data=elem;
c->next=temp->next;
temp->next=c;
return p;
}
Linklist* mergeTwoLists(Linklist* l1, Linklist* l2){
//Linklist *p1=(Linklist *)malloc(sizeof(Linklist));
//Linklist *p2=(Linklist *)malloc(sizeof(Linklist));
Linklist *res=(Linklist *)malloc(sizeof(Linklist));
res->next=NULL;
Linklist *temp=l1;
Linklist *temp2=l2;
int i=0;
temp2=temp2->next;
temp=temp->next;
while(temp2!=NULL&&temp!=NULL)
{
if(temp->data < temp2->data)
{
teil(res, temp->data);
//insert_elem(res, temp->data, i++);
temp=temp->next;
}
else
{
teil(res, temp2->data);
//insert_elem(res, temp2->data, i++);
temp2=temp2->next;
}
}
if(temp!=NULL)
{
while(temp!=NULL)
{
teil(res, temp->data);
temp=temp->next;
}
}
if(temp2!=NULL)
{
while(temp2!=NULL)
{
teil(res, temp2->data);
temp2=temp2->next;
}
}
return res;
};
int main()
{
Linklist *l1=Init();
Linklist *l2=Init();
display(mergeTwoLists(l1, l2));
//display(l1);
//display(l2);
return 0;
}
141. 环形链表(tbc)
206. 反转链表
思路:
把链表的数逐一放入数组
再反向遍历数组,逐个插入一个新链表中。
#include <iostream>
#include <math.h>
#include<algorithm>
using namespace std;
#define StackInitSize 100
#define MaxSize 100;
//链表
typedef int ElementType;
typedef struct ListNode {
int val;
struct ListNode *next;
}Linklist;
Linklist *Init()//输入链表长度
{
Linklist *p=(Linklist*)malloc(sizeof(Linklist));//创建一个头结点
Linklist *temp=p;//指针temp指向头结点用于遍历链表
do{
Linklist *a=(Linklist*)malloc(sizeof(Linklist));
cin>>a->val;
a->next=NULL;
temp->next=a;
temp=temp->next;
}while(getchar()!='\n');
return p;
}
void display(Linklist *p)
{
Linklist *temp=p;
while(temp->next)
{
temp=temp->next;
cout<<temp->val<<" ";
}
cout<<endl;
}
Linklist *head_insert(Linklist *p,ElementType elem)
{
Linklist *temp=p;
while(temp->next)
{
temp=temp->next;
}
Linklist *c=(Linklist*)malloc(sizeof(Linklist));
c->val=elem;
c->next=temp->next;
temp->next=c;
return p;
}
ListNode* reverseList(ListNode* head){
Linklist *p=head;
Linklist *p1=head;
Linklist *p2=head;
p=p->next;
p1=p1->next;
p2=p2->next;
Linklist *q;
q=(Linklist*)malloc(sizeof(Linklist));
q->next=NULL;
int count1=0;
while(p!=NULL)
{
//head_insert(q,p->val);
count1++;
p=p->next;
}
//cout<<"count1="<<count1<<endl;
int a[count1];
int i=0;
while(p1!=NULL)
{
a[i]=p1->val;
i++;
//cout<<"-"<<p->val<<" ";
p1=p1->next;
}
count1--;
while(p2!=NULL)
{
head_insert(q, a[count1--]);
p2=p2->next;
}
return q;
}
int main()
{
ListNode *l1,*l2;
l1=Init();
l2=reverseList(l1);
display(l2);
return 0;
}