带头结点单链表找公共结点

题目:设A和B是两个单链表(带头结,点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。

代码:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct ListNode
{
    ElemType data;
    ListNode *next;
} Node, *ListNode;

ListNode ListPublicNode(ListNode A, ListNode B)
{
    if (A == NULL || B == NULL || A->next == NULL || B->next == NULL)
    {
        return NULL;
    }
    ListNode C = (Node *)malloc(sizeof(Node));
    C->next = NULL; // 千万不要写成C=NULL
    ElemType k = 0, l = 0;
    ListNode p = A->next, q = B->next, c = A, s = C;
    while (A)
    {
        A = A->next;
        k += 1;
    }
    while (B)
    {
        B = B->next;
        l += 1;
    }
    if (k < l)
    {
        ElemType m = l - k;
        while (m != 0)
        {
            q = q->next;
            m--;
        }
        while (p && q)
        {
            if (p == q)
            {
                c = p->next;
                break;
            }
            p = p->next;
            q = q->next;
        }
    }
    else
    {
        ElemType m = k - l;
        while (m != 0)
        {
            p = p->next;
            m--;
        }
        while (p && q)
        {
            if (p == q) // p->next == q->next有可能跳过第一个结点
            {
                c = p->next;
                break;
            }
            p = p->next;
            q = q->next;
        }
    }
    while (c)
    {
        s->next = (Node *)malloc(sizeof(Node));
        s = s->next;
        s->data = c->data;
        c = c->next;
    }
    return C;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落入尘凡,羽化成仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值