链表 | 将递增有序的两个链表的公共元素合并为新的链表

王道P38T14

主代码:

LinkList common_subList(LinkList &A,LinkList &B){
    LNode *C=new LNode,*pC=C;
    C->next=NULL;
    LNode* pA=A->next,*pB=B->next;
    while(pA!=NULL && pB!=NULL){
        if(pA->data < pB->data){
            pA=pA->next;
        }else if(pA->data == pB->data){
            pC->next=new LNode;
            pC->next->data=pA->data;
            pC=pC->next;
            pC->next=NULL;
            pA=pA->next;
            pB=pB->next;
        }else{
            pB=pB->next;
        }
    }
    return C;
} 

完整代码:

#include <cstdio>
#include <stdlib.h>

using namespace std;

typedef struct LNode{
    int data;
    struct LNode* next=NULL;
    LNode(){    }
    LNode(int x){
        data=x;
    }
}LNode;

typedef LNode* LinkList;

LinkList  build_list(int * arr,int n){
    int i;
    LinkList L=new LNode;
    LinkList pre=L;
    for(i=0;i<n;i++){
        LinkList p=new LNode(arr[i]);
        pre->next=p;
        pre=p;
    }
    return L;
}

void show_list(LinkList& L){
    LinkList p=L->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    puts("");
}

LinkList common_subList(LinkList &A,LinkList &B){
    LNode *C=new LNode,*pC=C;
    C->next=NULL;
    LNode* pA=A->next,*pB=B->next;
    while(pA!=NULL && pB!=NULL){
        if(pA->data < pB->data){
            pA=pA->next;
        }else if(pA->data == pB->data){
            pC->next=new LNode;
            pC->next->data=pA->data;
            pC=pC->next;
            pC->next=NULL;
            pA=pA->next;
            pB=pB->next;
        }else{
            pB=pB->next;
        }
    }
    return C;
} 

int main(){
    int A_arr[5]={1,2,3,5,9};
    int B_arr[5]={0,2,2,6,9};
    LinkList A=build_list(A_arr,5);
    LinkList B=build_list(B_arr,5);
    LinkList C=common_subList(A,B);
    show_list(A);
    show_list(B);
    show_list(C);
}
 

注意:

要注意紫色代码处的pC指针滑动。在白纸上编写时我忽略了这步。

原文地址:https://www.cnblogs.com/TQCAI/p/8452028.html

时间: 2024-10-09 20:40:23

链表 | 将递增有序的两个链表的公共元素合并为新的链表的相关文章

链表 | 去除递增有序单链表中的重复元素

王道P37T12 主代码: void delete_common(LinkList& L){ LNode* pre=L,*p=L->next; while(p!=NULL){ LNode* r=p->next; while(r!=NULL && p->data==r->data){ pre->next=r; LNode* del=p; p=r; delete del; r=r->next; } pre=p; p=p->next; } } 完

有序输出两棵二叉查找树中的元素

题目:给出两棵二叉查找树,有序输出所有元素,时间复杂度O(n),空间复杂度O(h),h为树的高度 此题就是把两棵二叉查找树的中序遍历过程结合在一起. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void print2BSTsInSortedOrder(TreeNode *root1, TreeNode *roo

求给定的两个数组的公共元素,并将其返回为一个数组

如数组a:1,3,4,5,6,7,2 数组b:3,6,0,2 则方法返回数组c:{2,3,6} package test3; import java.util.Arrays; public class findCommonData { public static int[] getCommon(int []array1, int []array2){ int[] array3; int i=0,j=0,k=0; Arrays.sort(array1);//排序 Arrays.sort(array

判断一个非空单链表是否是递增有序的

直接附上代码,不理解请看置逆那篇,链接:https://www.cnblogs.com/biaobiao88/p/12042132.html #include<bits/stdc++.h> #define int long long using namespace std; typedef struct { int len; int *next; }node; //判断一个非空单链表是否是递增有序的 void Inceart(node *list) { int flag = 0; for(in

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

链表习题(4)-有一个带头结点的单链表,编写算法使其元素递增有序

1 /*有一个带头结点的单链表,编写算法使其元素递增有序*/ 2 /* 3 算法思想:利用直接插入排序的思想,先构成只含有一个数据结点的有序单链表,然后依次插入 4 剩余结点到合适的位置. 5 */ 6 void Sort(LinkList& L) 7 { 8 LNode *p = L->next, *pre; 9 LNode *r = p->next; 10 p->next = NULL; 11 while (p) 12 { 13 r = p->next; 14 pre

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5

如何判断单链表是否存在环 &amp; 判断两链表是否相交

给定一个单链表,只给出头指针h: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分

leetcode链表--14、add-two-numbers(两链表相加 得到新链表)

题目描述 You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 -