给定两个单链表,编写算法找出公共结点

输入形式为四行
第一行一个数字表示第一个单链表中的元素个数
第二行为第一个单链表各个结点的值
第三行为一个数字表示第二个单链表中的元素个数
第四行为第二个单链表各个结点的值
输出为两行
第一行为两个单链表公共元素个数
第二行为依次打印输出各个公共元素
若两个单链表无公共元素,
输出
0
无公共元素

最简单就是直接用较短链表去遍历长链表

这是引用的写法,供参考:

//**********************  引用版  **************
#include <stdio.h>
#include <malloc.h>
// 链表节点结构
typedef struct Node {
    int    data;
    struct Node* next;
}Node, * LinkList;
// 输出单链表
void show(LinkList L)
{
    L->data == -1 ? NULL : printf(L->data == 0 ? "%d\n无公共元素" : "%d\n", L->data);
    Node* p = L->next;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
LinkList findCommonNodes(LinkList L1, LinkList L2)
{
    LinkList L = (Node*)malloc(sizeof(Node));
    L->data = 0;
    L->next = NULL;
    Node* p = L1->next, * pL = L;
    while (p) {
        Node* q = L2->next;
        while (q)
        {
            if (p->data == q->data) {
                Node* f = (Node*)malloc(sizeof(Node));
                f->next = NULL;
                f->data = q->data;
                L->data++;
                pL->next = f;
                pL = f;
                break;
            }
            q = q->next;
        }
        p = p->next;
    }
    return L;
}
// 创建链表 
void createListFromHead(LinkList& L)
{
    Node* pL;
    int n, i;
    L = (Node*)malloc(sizeof(Node));// 创建头 
    L->data = -1;
    L->next = NULL;
    pL = L;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {// 生成链表
        Node* p = (Node*)malloc(sizeof(Node));
        p->next = NULL;
        scanf("%d", &p->data);
        pL->next = p;
        pL = p;
    }
}
int main() 
{
    LinkList L1, L2, L = NULL;
    createListFromHead(L1);
    createListFromHead(L2);
    //show(L1);
    //show(L2);
    show(L = findCommonNodes(L1, L2));

    return 0;
}

再提供个纯指针版的:

//**************  指针版: 指针写法  ******************


#include <stdio.h>
#include <malloc.h>
// 链表节点结构
typedef struct Node {
    int    data;
    struct Node* next;
}Node, * LinkList;
// 输出单链表
void show(LinkList L)
{
    L->data == -1 ? NULL : printf(L->data == 0 ? "%d\n无公共元素" : "%d\n", L->data);
    Node* p = L->next;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
LinkList findCommonNodes(LinkList L1, LinkList L2)
{
    LinkList L = (Node*)malloc(sizeof(Node));
    L->data = 0;
    L->next = NULL;
    Node* p = L1->next, * pL = L;
    while (p) {
        Node* q = L2->next;
        while (q)
        {
            if (p->data == q->data) {
                Node* f = (Node*)malloc(sizeof(Node));
                f->next = NULL;
                f->data = q->data;
                L->data++;
                pL->next = f;
                pL = f;
                break;
            }
            q = q->next;
        }
        p = p->next;
    }
    return L;
}
// 创建链表 
void createListFromHead(LinkList* L)
{
    Node* pL;
    int n, i;
    (*L) = (Node*)malloc(sizeof(Node));// 创建头
    (*L)->data = -1;
    (*L)->next = NULL;
    pL = (*L);
    scanf("%d", &n);
    for (i = 0; i < n; i++) {// 生成链表
        Node* p = (Node*)malloc(sizeof(Node));
        p->next = NULL;
        scanf("%d", &p->data);
        pL->next = p;
        pL = p;
    }
}
int main()
{
    LinkList L1, L2, L = NULL;
    createListFromHead(&L1);
    createListFromHead(&L2);
    //show(L1);
    //show(L2);
    show(L = findCommonNodes(L1, L2));
 
    return 0;
}