题目:设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;
}