2009
2012年 链表
T42
类似题型2009年42题
都是两个指针求解问题
都错误使用了空间换时间❌!!!
注意⚠️:Node* p = (Node*)malloc(sizeof(Node));
p为指向头节点的指针
#include<bits/stdc++.h>
using namespace std;
struct Node{
char data;
Node* next;
}NODE;
Node* add_node(Node* a,char b){
Node* p = (Node*)malloc(sizeof(Node));
p->data=b;
p->next=NULL;
a->next = p;
return p;
}
Node* create_node1(Node* a){
Node* p = a;
p = add_node(p,'l');
p = add_node(p, 'o');
p = add_node(p, 'a');p = add_node(p, 'd');
return p;
}
Node* create_node2(Node* a){
Node* p = a;
p = add_node(p,'e');
p = add_node(p, 'a');
p = add_node(p, 't');
return p;
}
void creat_node(Node* str1,Node* str2){
Node* p;Node* q;
p = create_node1(str1);
q = create_node2(str2);
Node* p1 = (Node*)malloc(sizeof(Node));
p1->data = 'i';
p1->next=NULL;
p->next = p1;
q->next = p1;
// p1 = add_node(p1,'i');
p1 = add_node(p1, 'n');
p1 = add_node(p1, 'g');
}
int main()
{
//题目环境--两个链表str1,str2;
Node* str1 = (Node*)malloc(sizeof(Node));
Node* str2 = (Node*)malloc(sizeof(Node));
creat_node(str1, str2);
// str1=str1->next;
// while(str1!=NULL){
// printf("%c",str1->data);
// str1=str1->next;
// }
// //打印--loading
// //题解 --空间换时间 时间复杂度O(m+n+c)c公共子串长度 空间复杂度O(m+n)垃圾!!!!!
// Node* a[1000];Node* b[1000];
// int count1=-1,count2=-1;
// Node* p;Node* q;
// p=str1->next;q=str2->next;
// while(p!=NULL){//遍历链表并存储到数组中;
// a[++count1]=p;
// p=p->next;
// }
// while(q!=NULL){
// b[++count2]=q;
// q=q->next;
// }
// int flag = -1;
// for(int i=count2,j=count1;i>-1&&j>-1;i--,j--){
// if(a[i]!=b[j]){
// flag =i-1;
// break;
// }
// }
// printf("%c",a[flag]->data);
//标准题解 --运用两个指针求解 链表长度之差k 然后长的链表先遍历k个节点,之后两个链表同时一起遍历 时间复杂度O(m+n)
int len1,len2;len1=0;len2=0;
Node* p = str1->next;//指向第一个元素
while(p!=NULL){
len1++;
p=p->next;
}
p = str2->next;//指向第一个元素
while(p!=NULL){
len2++;
p=p->next;
}
int k = abs(len1-len2);
if(len1>len2){
p=str1->next;
Node* q = str2->next;
for(int i=0;i<k;i++)p=p->next;
for(int i=0;i<len2-k;i++){
if(p==q)break;
p=p->next;q=q->next;
}
printf("%c",p->data);
}else{
p=str2->next;
Node* q = str1->next;
for(int i=0;i<k;i++)p=p->next;
for(int i=0;i<len1-k;i++){
if(p==q)break;
p=p->next;q=q->next;
}
printf("%c",p->data);
}
}