数据结构大题

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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47696370/article/details/131598142
今日推荐