编程算法 - 合并订单列表

合并有序链表

本文地址: http://blog.csdn.net/caroline_wendy/article/details/29352997

题目:

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

节点结构:

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

时间: 2024-08-11 18:46:18

编程算法 - 合并订单列表的相关文章

编程算法 - 篱笆修理(Fence Repair) 代码(C)

篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 切割的开销是木板长度, 求将木板切割完的最小开销. 即霍夫曼编码(Huffman). 贪心算法, 类似二叉树型结构, 最短板和次短板是兄弟结点, 选取两个最小木板, 最后进行切割, 合并两个最小木板, 依次递推. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author:

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

概述:编程算法,是完成程序逻辑的主要途径.本文推荐十大编程算法,有利于程序员的编程逻辑. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(lis

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

十大编程算法助程序员走上大神之路 本文为转发,源地址:http://linux.cn/article-3613-1.html 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and co

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

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

线性表算法-合并

线性表算法-合并

编程算法 - 两个链表的第一个公共结点 代码(C)

两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动较长链表的指针, 使其到相同结点的距离的相同, 再同时移动两个链表的指针, 找到相同元素. 时间复杂度: O(n) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #i

编程算法 - 数字在排序数组中出现的次数 代码(C)

数字在排序数组中出现的次数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 统计一个数字在排序数组中出现的次数. 通过折半查找, 找到首次出现的位置, 再找到末次出现的位置, 相减即可. 时间复杂度O(logn). 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #inc

编程算法 - 二叉树的深度 代码(C)

二叉树的深度 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一棵二叉树的根节点, 求该树的深度. 依次选择最深的左右子树, 然后递归加1. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> #include <

编程算法 - 判断二叉树是不是平衡树 代码(C)

判断二叉树是不平衡树 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一颗二叉树的根结点, 判断该树是不是平衡二叉树. 二叉平衡树: 任意结点的左右子树的深度相差不超过1. 使用后序遍历的方式, 并且保存左右子树的深度, 进行比较. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std