已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
时间: 2024-03-16 16:35:48 浏览: 39
要构造出两个非降序链表S1和S2的交集新链表S3,可以按照以下步骤进行:
1. 首先,创建一个新的空链表S3,用于存储交集元素。
2. 分别读取输入的S1和S2的非降序序列,并用-1表示序列的结尾。
3. 使用尾插法将S1和S2的元素逐个插入到S3中,直到其中一个链表的元素插入完毕。
4. 在插入的过程中,比较当前两个链表节点的值,如果节点值相等,则将其插入到S3中,并且两个链表的指针同时后移;如果节点值不相等,则将较小节点的指针后移。
5. 当其中一个链表的指针为空时,表示所有元素都已经插入到S3中,此时,将另一个链表剩余的元素依次插入到S3中。
6. 最后,输出新链表S3的元素序列,即为S1和S2的交集新链表。
相关问题
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3
好的,让我看看可以为您服务!关于您的第一个问题,可以使用双指针来解决。首先,我们需要新建一个链表用于存储交集。然后,我们使用两个指针分别指向两个链表的头节点,并比较它们的值。如果两个值相同,则将该值添加到新链表中。如果S1当前节点的值小于S2当前节点的值,则S1向后移动一个节点,反之,则S2向后移动一个节点。直到一个链表遍历完成,则停止遍历。最终,新建的链表S3即为S1与S2的交集。
以下是C++代码实现:
```
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
ListNode* res = new ListNode(0);
ListNode* cur = res;
while (headA != NULL && headB != NULL) {
if (headA->val == headB->val) {
cur->next = new ListNode(headA->val);
cur = cur->next;
headA = headA->next;
headB = headB->next;
} else if (headA->val < headB->val) {
headA = headA->next;
} else {
headB = headB->next;
}
}
return res->next;
}
```
注意:这个函数不会判断S1与S2是否为非降序链表序列,需要在调用该函数前自己先进行判断。
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
1. 定义节点结构体Node,包括元素值和指向下一个节点的指针。
2. 定义函数intersect(S1, S2),其中S1和S2分别表示链表S1和S2的头节点。
3. 初始化S3为空链表。
4. 从S1和S2的头节点开始遍历链表,比较两个节点的元素值,若相等则将该元素插入S3中。
5. 若S1或S2已经遍历到末尾,则退出循环。
6. 返回S3。
代码实现:
```
struct Node {
int val;
Node* next;
Node(int x) : val(x), next(NULL) {}
};
Node* intersect(Node* S1, Node* S2) {
Node* S3 = NULL;
Node* tail = NULL;
while (S1 && S2) {
if (S1->val == S2->val) {
if (!S3) {
S3 = new Node(S1->val);
tail = S3;
} else {
tail->next = new Node(S1->val);
tail = tail->next;
}
S1 = S1->next;
S2 = S2->next;
} else if (S1->val < S2->val) {
S1 = S1->next;
} else {
S2 = S2->next;
}
}
return S3;
}
```