我有两个链接列表。
typedef struct node
{
char value[256];
struct node *next;
} Node_t;
typedef struct node1
{
char value1[256];
int count;
struct node1 *next;
} Node1_t;
两个链表都有数据,我想比较两个链表之间的数据,哪些数据很常见,有没有办法找到两个链表之间的类似数据?
感谢。
答案 0 :(得分:3)
如果两个列表都已排序,那么您可以使用以下算法(伪代码,运行时复杂度O(n+m)
):
INPUT: list1, list2 (first nodes of the lists you want to compare, sorted!)
while list1 != null AND list2 != null
if list1->value < list2->value
list1->value = list1->next
elseif
list2->value < list1->value
list2->value = list2->next
else
list3->appendValue(list1->value)
list1->next
如果其中一个列表未排序,则必须将第一个列表中的每个元素与第二个列表中的每个元素进行比较(运行时复杂度O(n*m)
):
INPUT: list1, list2 (first nodes of the lists you want to compare)
while list1 != null
list2temp = list2
while list2temp != null
if list1->value == list2temp->value
list3->appendValue(list1->value)
list2temp = list2temp->next
list1 = list1->next
首先对列表进行排序然后使用第一种方法通常会更好,这将导致运行时复杂度为O(n log n + m log m)
。
在这两种情况下,list3
都将包含两个列表的公共元素。
答案 1 :(得分:2)
list = head;
while (list) {
list1 = head1;
while (list1) {
if (yourcompare(list->value, list1->value) == 0) {
// do something with common data
// if only possible case: then break;
}
list1 = list1->next;
}
list = list->next;
}
如果list1中曾经匹配的值不再匹配,您可以添加“短更新”之类的簿记数据。所以你需要'if(!list1-&gt;更新){...; list1-&gt; updated = TRUE;}'在内在的内部。