编程算法之合并有序链表

题目:

合并有序链表, 给定两个升序的链表, 返回一个合并之后的升序链表.

节点结构:

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>
#include <vector>  

using namespace std;  

struct Node{
    int val;
    Node *next;
};  

Node* mergeList(Node *list_a, Node* list_b) {
    if (list_a == NULL) //递归的终止条件
        return list_b;
    else if (list_b == NULL)
        return list_a;  

    Node* pMergedHead = NULL; //合并后的链表  

    if (list_a->val < list_b->val) {
        pMergedHead = list_a; //指向头结点
        pMergedHead->next = mergeList(list_a->next, list_b); //递归
    } else {
        pMergedHead = list_b;
        pMergedHead->next = mergeList(list_a, list_b->next);
    }  

    return pMergedHead;
}  

Node* initList(const std::vector<int>& vi) {
    Node* pHead = new Node;
    Node* pTemp = pHead;  

    for (std::size_t i=0; i<vi.size(); ++i) {
        pTemp->val = vi[i];  

        if (i != vi.size()-1) { //非尾结点
            Node* pNode = new Node;
            pTemp->next = pNode;
            pTemp = pTemp->next;
        }
    }  

    pTemp->next = NULL;  

    return pHead;
}  

void printList(Node* L) {
    Node* pTemp = L;
    while (pTemp->next != NULL) {
        std::cout << pTemp->val << " ";
        pTemp = pTemp->next;
    }
    std::cout << pTemp->val << " "; //打印最后一个值
    std::cout << std::endl;
}  

int main(void) {
    std::vector<int> via = {1, 2, 3, 4, 5, 13};
    std::vector<int> vib = {2, 4, 5, 7, 9, 11};  

    Node* list_a = initList(via);
    Node* list_b = initList(vib);
    std::cout << "list_a = "; printList(list_a);
    std::cout << "list_b = "; printList(list_b);  

    Node* list_merge = mergeList(list_a, list_b);
    std::cout << "list_merge = "; printList(list_merge);  

    return 0;
}

输出:

list_a = 1 2 3 4 5 13
list_b = 2 4 5 7 9 11
list_merge = 1 2 2 3 4 4 5 5 7 9 11 13

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

作者:csdn博客 Caroline-Wendy

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索递归
, return
, node
, next
, 链表 算法
, 链表 递归
, 链表合并
, 有序链表
升序
合并两个有序链表、两个有序单链表的合并、合并有序链表、java合并两个有序链表、有序链表的合并,以便于您获取更多的相关知识。

时间: 2024-09-21 00:41:06

编程算法之合并有序链表的相关文章

合并有序链表

场景:存在表L1(A B C D E),有序表L2(2 4 8),有序表L3(2 5).删除表L1中位 置序号属于有序表L2和L3,即删除后L1(A C). 使用的数据结构是一个链表节点 public class Inode { private int value; private Inode next; public Inode(int value) { this.value = value; next = null; } public Inode(int value, Inode next)

链表合并-如何用递归算法实现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-&

《算法基础》——3.4 有序链表

3.4 有序链表 有时,让链表中的项保持有序是十分方便的.当将一个新项加入有序链表时,需要搜索链表来找到该项所属位置,并更新相应的链接来插入该项.下面的伪代码显示了在一个有序链表中插入一个项的算法: 在最坏的情况下,该算法可能需要遍历整个链表为新项找到正确的位置.因此,如果该链表保存N个单元格,其运行时间为O(N).虽然不能提高理论运行时间,但是可以通过添加底端哨兵使算法更简单而且在实际运行中更加快速.如果将底部哨兵的Value设定成一个比单元格中任意可能存储的Value值都大的值,就可以删除对

十大编程算法助程序员走上大神之路

十大编程算法助程序员走上大神之路 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤:

Javascript排序算法之合并排序的2个例子介绍

 这篇文章主要介绍了Javascript排序算法之合并排序(归并排序)的2个例子,需要的朋友可以参考下 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.   归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.   归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(

Java模拟有序链表数据结构的示例_java

有序链表:按关键值排序.删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时需要比较O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 如果一个应用需要频繁的存取(插入/查找/删除)最小(/最大)的数据项,那么有序链表是一个不错的选择 优先级队列 可以使用有序链表来实现 有序链表的插入排序: 对一个无序数组,用有序链表来排序,比较的时间级还是O(N^2) 复制时间级为O(2*N),因为复制的次数较少,第一次放进链表数据移动N次,再从链表复制到数组,又

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

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

无锁有序链表的实现

无锁有序链表可以保证元素的唯一性,使其可用于哈希表的桶,甚至直接作为一个效率不那么高的map.普通链表的无锁实现相对简单点,因为插入元素可以在表头插,而有序链表的插入则是任意位置. 本文主要基于论文High Performance Dynamic Lock-Free Hash Tables实现.   主要问题 链表的主要操作包含insert和remove,先简单实现一个版本,就会看到问题所在,以下代码只用作示例: struct node_t { key_t key; value_t val; n

Javascript排序算法之合并排序(归并排序)的2个例子_基础知识

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个