【39】链表合并

题目: 输入两个递增排序的链表,要求把两个链表和并成一个链表并且使得新链表也是递增排序的。

分析:

1. 假设两个链表如下所示

    

2. 要合并两个链表,可以利用归并排序的合并思想,从头枚举两个链表,判断两个指针指向的两个结点的值关系。

   (1)初始化两个指针p1,p2分别指向两个链表的头结点,合并之后新的链表头结点肯定是两个链表中值较小的那个

   (2)每一次比较两个指针指向的结点值的大小,如果p1较小则把p1指向结点加入新链表,否则加入p2指向的结点。直到有一个链表为空,然后把剩下的所有结点全部加入新链表即可

3. 代码(归并排序思想)

//链表结点
struct ListNode{
    int value;
    ListNode *nextNode;
}; 

//合并两个链表
ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
    //如果第一个链表是空链表返回链表2头结点
	if(headOne == NULL){
       return headTwo;
    }
    //如果第二个链表是空链表返回链表1头结点
	if(headTwo == NULL){
       return headOne;
    }
    //设定两个指针分别指向两个链表头结点
    ListNode *p1 = headOne;
    ListNode *p2 = headTwo;
    ListNode *newHeadNode = NULL;
	//判断哪一个是新的头结点
	if((p1->value) <= (p2->value)){
       newHeadNode = p1;
       p1 = p1->nextNode;
    }
    else{
	   newHeadNode = p2;
	   p2 = p2->nextNode;
    }
    //设置一个指向新链表的指针
    ListNode *curNode = newHeadNode;
    //合并两个链表
	while((p1 != NULL) && (p2 != NULL)){
       if((p1->value) <= (p2->value)){
           curNode->nextNode = p1;
           curNode = curNode->nextNode;
           p1 = p1->nextNode;
	   }
       else{
	       curNode->nextNode = p2;
		   curNode = curNode->nextNode;
		   p2 = p2->nextNode;
	   }
	}
	//把剩下没有加入的全部加入新链表
	//最多只会有一个链表不为空
	while((p1 != NULL)){
       curNode->nextNode = p1;
       curNode = curNode->nextNode;
	   p1 = p1->nextNode;
	}
	while(p2 != NULL){
       curNode->nextNode = p2;
       curNode = curNode->nextNode;
	   p2 = p2->nextNode;
	}
	//返回新的链表结点
	return newHeadNode;
}

递归代码,更加简洁

struct ListNode{
    int value;
    ListNode *nextNode;
}; 

//合并两个链表
ListNode* MergeList(ListNode *headOne, ListNode *headTwo){
    //链表1为空
	if(headOne == NULL){
        return headTwo;
    }
    //链表2为空
	if(headTwo == NULL){
        return headOne;
	}
	//新建一个结点
	ListNode *newNode = NULL;
	if((headOne->value) <= (headTwo->value)){
        newNode = headOne;
        newNode->nextNode = MergeList(headOne->nextNode, headTwo);
	}
	else{
        newNode = headTwo;
        newNode->nextNode = MergeList(headOne, headTwo->nextNode);
    }
    return newNode;
}
时间: 2024-09-20 12:13:41

【39】链表合并的相关文章

链表合并-如何用递归算法实现2个有序链表的合并?

问题描述 如何用递归算法实现2个有序链表的合并? stu* Combine(stu* head1, stu* head2) { if (head1 == NULL) { return head2; } if (head2 == NULL) { return head1; } stu* head = NULL; if (head1->m_score < head2->m_score) { head = head2; head->next = Combine(head1,head2-&

编程算法之合并有序链表

题目: 合并有序链表, 给定两个升序的链表, 返回一个合并之后的升序链表. 节点结构: struct Node{ int val; Node *next; }; 要求实现的函数: Node* mergeList(Node *list_a, Node* list_b) 代码: /* * test.cpp * * Created on: 2014.04.24 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #inc

探讨:将两个链表非降序合并为一个链表并依然有序的实现方法_C 语言

已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点.实现过程中,list1中的节点和list2中的节点都转移到了list3中,注意泛型的友元函数的用法.程序如有不足之处,还望指正!!!定义List类 复制代码 代码如下: #include "stdafx.h"#include <iostream> using namespace std;template<class T>struct Node

适用于连续资源块的数组空闲链表的算法

如何来管理空闲资源,显而易见的是组织成一个双向链表,称作freelist,然后每次从该链表上取出一个 ,释放的时候再放回去.为了减少碎片,最好的策略就是优先分配最近释放掉的那个,如果能考虑合并的话 ,类似伙伴系统那样,就再好不过了,本文给出的是一个通用的可以将资源映射到一个整型ID的资源分配算 法,完全基于一个数组,不需要内存管理,也不需要分配结构体. 组织链表的时候,内存管理要耗去大量 的工作,前向指针和后向指针的修改前提是必须有这些指针.典型的数据结构就是Linux内核的list_head结

归并排序-新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢!

问题描述 新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢! //第九章章末习题第10题#include//建立a b两链表包含学号成绩,把两个链表合并升序排列输出.求思路!#include#define LEN sizeof(struct student) struct student{ long num; int score; struct student * next; };struct student listalistb;int nsu

深度剖析linux内核万能--双向链表,Hash链表模版

我们都知道,链表是数据结构中用得最广泛的一种数据结构,对于数据结构,有顺序存储,数组就是一种.有链式存储,链表算一种.当然还有索引式的,散列式的,各种风格的说法,叫法层出不穷,但是万变不离其中,只要知道什么场合用什么样的数据结构,那就行了. 那么,标题说的内核万能链表,其实就是内核链表,它到底和我们平常大学学的数据结构的链表有什么不同呢??内核链表,是在linux内核里的一种普遍存在的数据结构,比如内核调度算法中有这样的结构,摄像头驱动程序,wifi模块,G_sensor等等,用到链表的东西实在

PHP链表操作简单示例_php技巧

本文实例讲述了PHP链表操作.分享给大家供大家参考,具体如下: 在php中运行数据结构,基本都是用数组模拟的,只是用一直思想而已. 今天遇到的这个问题是,两个链表进行合并. 链表合并效果图 问题描述:A链表是模版链表,B链表的长度不确定,A,B二个链表结合后形成C链表. 说一下编程思想:A链表是模版链表所以在运算完成了,长度了唯一不变的.而B链表的长度是不确定的.所以可以先对B链表进行判断,分了三步: B链表是不是为空 B链表是不是比A链表短或者相等 B链表是不是比A链表长 编程就是要列出尽可能

java:快速文件分割及合并

文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位,对文件进行分割或合并. 看下基本思路: 如果有一个大文件,指定分割大小后(比如:按1M切割) step 1: 先根据原始文件大小.分割大小,算出最终分割的小文件数N step 2: 在磁盘上创建这N个小文件 step 3: 开多个线程(线程数=分割文件数),每个线程里,利用RandomAccessF

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

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. Input 第一行输入M与N的值:  第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. Output 输出合并后的单链表所包含的M+N个有序