剑指offer系列源码-合并两个排序的链表

题目1519:合并两个排序的链表
时间限制:1 秒内存限制:128 兆特殊判题:否提交:1309解决:615
题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。
输出:
对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。
样例输入:
5 2
1 3 5 7 9
2 4
0 0
样例输出:
1 2 3 4 5 7 9
NULL
#include<stdio.h>
#include<iostream>
using namespace std;
struct ListNode{
    int value;
    ListNode* next;
};
ListNode* megerList(ListNode* aHead,ListNode* bHead){
    if(aHead==NULL){
        return bHead;
    }
    if(bHead==NULL){
        return aHead;
    }
    ListNode* megeredHead = NULL;
    if(aHead->value<bHead->value){
            megeredHead = aHead;
            megeredHead->next = megerList(aHead->next,bHead);
    }else{
            megeredHead = bHead;
            megeredHead->next = megerList(aHead,bHead->next);
    }
    return megeredHead;
}
int main(){
    int n,m;
    ListNode* aNode;
    ListNode* aHead;
    ListNode* bNode;
    ListNode* bHead;
    while(scanf("%d%d",&n,&m)!=EOF){
        if(n<=0&&m<=0){
            printf("NULL\n");
            continue;
        }
        //构造链表
       for(int i=0;i<n;i++){
           ListNode* pNew = new ListNode();
            scanf("%d",&pNew->value);
            pNew->next=NULL;
            if(i==0){
                 aNode = aHead = pNew;
            }else{
                aNode->next = pNew;
                aNode = pNew;
            }
       }
       for(int i=0;i<m;i++){
            ListNode* pNew = new ListNode();
            scanf("%d",&pNew->value);
            pNew->next=NULL;
            if(i==0){
                 bNode = bHead = pNew;
            }else{
                bNode->next = pNew;
                bNode = pNew;
            }
       }
        ListNode* megeredHead = megerList(aHead,bHead);
        while(megeredHead->next){
            printf("%d ",megeredHead->value);
            megeredHead = megeredHead->next;
       }
       printf("%d\n",megeredHead->value);
    }
    return 0;
}

oj地址

时间: 2024-10-02 04:15:46

剑指offer系列源码-合并两个排序的链表的相关文章

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer面试题17——合并两个排序的链表

题目1519:合并两个排序的链表 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接

剑指offer之面试题17合并两个排序的链表

问题描述: 输入两个递增的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 实现代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct List{ int date; struct List *next; }; struct List* doMergeList(struct List *P1head,struct List *P2head){ if(P1head==NU

剑指offer 面试题17—合并两个排序的链表

题目: 输入两个递增排序的链表,合并这两个链表并使得新链表中的节点仍然是按照递增排序的. 基本思想: 当我们得到两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此合并的步骤和之前的而不周是一样的.这就是典型的递归的过程. #include <iostream> using namespace std; typedef int ElemType;//数据类型模板 typedef struct Node//结点 { ElemType data; struc

《剑指Offer》题目:合并两个排序的链表

题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码的鲁棒性. 2.合并完一个结点后,剩余的链表仍然是有序的,再合并下一个结点时的过程是一样的,这是一种递归的思想,因此采用递归来合并. Java代码: public class MergeSortedList { public ListNode Merge(ListNode list1,ListNod

剑指offer(16)合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题代码: /*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2) { // write code here if(pHead1 == null && pHead2 == null){ return null; } if(pHead1 == null){ ret

【剑指Offer】16、合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一:使用ArrayList 1 public static ListNode Merge(ListNode list1,ListNode list2) { 2 if(list1==null||list2==null){ 3 if(list1==null){ 4 return list2; 5 }else{ 6 return list1; 7 } 8 } 9 ArrayList<ListNo

剑指offer_面试题17_合并两个排序的链表(两种思维)

题目:输入两个递增排序的链表,合并这两个链表,并使新链表中的结点仍然是按照递增排序的. 第一种思维:合并两个排序的链表,类似于合并两个排序数组,所不同的仅是一个用链表保存数据,一个用数组保存数据. 算法如下:(下面的算法前提是:头结点 不是 链表的第一个数据节点.) /**方法一:合并两个排序链表,使用了新创建的链表来保存,没有改动两个原始链表*/ ListNode *merge_tow_list(ListNode *pHead1,ListNode *pHead2) { if(NULL == p

剑指offer系列源码-数组中的逆序对

题目1348:数组中的逆序对 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2133解决:500 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4