题目描述
给定两个升序链表,打印两个升序链表的公共部分。
输入描述:
第一个链表的长度为 n。
第二个链表的长度为 m。
链表结点的值为 val。
输出描述:
输出一行整数表示两个升序链表的公共部分的值 (按升序输出)。
题解:
有序链表就很好办了,从两个链表的头开始,进行以下操作:
- 如果 head1 的值小于 head2 ,则 head1 移动到下一个位置;
- 如果 head2 的值小于 head1 ,则 head2 移动到下一个位置;
- 如果 head1 的值与 head2 的值相等,则打印该值,并同时移动到下一个位置;
- head1 或 head2 有一个为空则停止。
代码:
# include <bits/stdc++.h>
using namespace std;
struct list_node{
int val;
struct list_node * next;
}; //链表的节点
list_node * input_list(void) //读入链表
{
int n, val;
list_node * phead = new list_node();
list_node * cur_pnode = phead;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &val);
if (i == 1) {
cur_pnode->val = val;
cur_pnode->next = NULL;
}
else {
list_node * new_pnode = new list_node();
new_pnode->val = val;
new_pnode->next = NULL;
cur_pnode->next = new_pnode;
cur_pnode = new_pnode;
}
}
return phead;
}
void sol(list_node * a_head, list_node * b_head)
{
//在下面完成代码
while (a_head && b_head) {
if (a_head->val < b_head->val) a_head = a_head->next;
else if (a_head->val > b_head->val) b_head = b_head->next;
else {
printf("%d ", a_head->val);
a_head = a_head->next;
b_head = b_head->next;
}
}
}
int main ()
{
list_node * a_head = input_list(); // A 链表的头节点
list_node * b_head = input_list(); // B 链表的头节点
sol(a_head, b_head);
return 0;
}