PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists

7-2 Merging Linked Lists (25分)

Given two singly linked lists L​1​​=$a​_1$​​→$a​_2$→⋯→$a​_{n-1}$​​→$a​_n$​​ and L​2​​=$b​_1​​$→$b​_2$​​→⋯→$b​_{m-1}$​​→$b​_m​​$​​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a​1​​→a​2​​→b​m​​→a​3​​→a​4​​→b​m−1​​⋯. For example, given one list being 6→7 and the other one 1→2→3→4→5, you must output 1→2→7→3→4→6→5.node

Input Specification:

Each input file contains one test case. For each case, the first line contains the two addresses of the first nodes of L​1​​ and L​2​​, plus a positive $N (≤10^5)$ which is the total number of nodes given. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.git

Then N lines follow, each describes a node in the format:算法

Address Data Next

where Address is the position of the node, Data is a positive integer no more than 10​5​​, and Next is the position of the next node. It is guaranteed that no list is empty, and the longer list is at least twice as long as the shorter one.spa

Output Specification:

For each case, output in order the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.3d

Sample Input:

00100 01000 7
02233 2 34891
00100 6 00001
34891 3 10086
01000 1 02233
00033 5 -1
10086 4 00033
00001 7 -1

Sample Output:

01000 1 02233
02233 2 00001
00001 7 34891
34891 3 10086
10086 4 00100
00100 6 00033
00033 5 -1

题目限制:

image.png

题目大意:

给定两个链表,如今须要将短的链表按照以下的方法插入到长的链表中,首先将短链表逆序,而后每隔两个节点插入到长的链表中去。code

算法思路:

咱们使用list1和list2分别保存两个链表,这里假设list1保存的是短的,另一种状况同样,使用result保存全部插入完毕的链表,其实能够分2种情形考虑这个问题,第一种就是list1还有节点须要插入,那么就把插入2个list2节点和1个list1节点当作一个原子操做,第二种状况就是list1没有节点插入了,那么就依次插入list2节点,直到完毕便可。具体作法以下:orm

  • 一、使用index_list1 = list1.size()-1,index_list2 = 0,分别表示目前list1和list2的待插入位置
  • 二、只要index_list2<list2.size(),就说明插入过程没有结束转3,不然转5
  • 三、若是index_list1>=0,说明list1还有节点,插入2个list2节点和1个list1节点,转2
  • 四、若是index_list1<0,直接插入list2节点,转2
  • 五、输出全部的result,每个节点的next即为后一节点的address。

提交结果:

image.png

AC代码:

#include<cstdio>
#include<vector>

using namespace std;

struct Node{
    int address;
    int data;
    int next;
}all[100000];
int num = 0;

vector<Node> list1;
vector<Node> list2;
vector<Node> result;

int main(){
    int begin1,begin2,N;
    scanf("%d %d %d",&begin1,&begin2,&N);
    Node node;
    for(int i=0;i<N;++i){
        scanf("%d %d %d",&node.address,&node.data,&node.next);
        all[node.address] = node;
    }
    while(begin1!=-1){
        list1.push_back(all[begin1]);
        begin1 = all[begin1].next;
    }
    while(begin2!=-1){
        list2.push_back(all[begin2]);
        begin2 = all[begin2].next;
    }
    if(list1.size()<list2.size()){
        // list2更长
        int index_list1 = list1.size()-1;
        int index_list2 = 0;
        while(index_list2<list2.size()){
            if(index_list1>=0){
                // 若是list1还有节点
                for(int i=0;i<2;++i){
                    result.push_back(list2[index_list2]);
                    ++index_list2;
                }
                result.push_back(list1[index_list1]);
                --index_list1;
            }else{
                result.push_back(list2[index_list2]);
                ++index_list2;
            }
        }
    }else{
        // list1更长
        int index_list1 = 0;
        int index_list2 = list2.size()-1;
        while(index_list1<list1.size()){
            if(index_list2>=0){
                // 若是list2还有节点
                for(int i=0;i<2;++i){
                    result.push_back(list1[index_list1]);
                    ++index_list1;
                }
                result.push_back(list2[index_list2]);
                --index_list2;
            }else{
                result.push_back(list1[index_list1]);
                ++index_list1;
            }
        }
    }
    for(int i=0;i<result.size();++i){
        printf("%05d %d ",result[i].address,result[i].data);
        if(i!=result.size()-1){
            printf("%05d\n",result[i+1].address);
        }else{
            printf("-1\n");
        }
    }
    return 0;
}
相关文章
相关标签/搜索