7-2 Merging Linked Lists (25分)

Given two singly linked lists L1=$a_1$→$a_2$→⋯→$a_{n-1}$→$a_n$ and L2=$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 a1→a2→bm→a3→a4→bm−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.

Input Specification:

Each input file contains one test case. For each case, the first line contains the two addresses of the first nodes of L1 and L2, 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.

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 105, 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.

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.

Sample Input:

00100 01000 702233 2 3489100100 6 0000134891 3 1008601000 1 0223300033 5 -110086 4 0003300001 7 -1

Sample Output:

01000 1 0223302233 2 0000100001 7 3489134891 3 1008610086 4 0010000100 6 0003300033 5 -1

题目限度:

题目粗心:

给定两个链表,当初须要将短的链表依照如下的办法插入到长的链表中,首先将短链表逆序,而后每隔两个节点插入到长的链表中去。

算法思路:

咱们应用list1和list2别离保留两个链表,这里假如list1保留的是短的,另外一种状况一样,应用result保留所有插入结束的链表,其实能够分2种情景思考这个问题,第一种就是list1还有节点须要插入,那么就把插入2个list2节点和1个list1节点看成一个原子操作,第二种状况就是list1没有节点插入了,那么就顺次插入list2节点,直到结束即可。具体做法如下:

  • 1、应用index_list1 = list1.size()-1,index_list2 = 0,别离示意目前list1和list2的待插入地位
  • 2、只有index_list2<list2.size(),就阐明插入过程没有完结转3,否则转5
  • 3、如果index_list1>=0,阐明list1还有节点,插入2个list2节点和1个list1节点,转2
  • 4、如果index_list1<0,直接插入list2节点,转2
  • 5、输入所有的result,每一个节点的next即为后一节点的address。

提交后果:

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;}