将两个有序链表合并成一个新的有序链表
来源:互联网 发布:女王级战列舰 知乎 编辑:程序博客网 时间:2024/06/04 21:01
原文档地址:http://blog.csdn.net/lalor/article/details/7429989
问题定义:
写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。
比如:这里有两个链表,分别是
list1: 5->10->15
list2: 2->3->20
SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->20
程序需要考虑如下情况:两个链表(函数参数)都有可能为空,也可能其中一个链表已经遍历完了,另一个链表还有很多元素。
方法1(虚拟节点)
这种方法用一个虚拟节点(dummy node)作为结果链表的起始节点,为了方便在链表尾部插入节点,还需要用一个尾指针指向链表的尾节点。
初始时,结果链表为空的时候,尾指针指向的是虚拟节点。因为虚拟节点是一个在栈上分配的临时变量,所以对它的操作都是非常高效的。在循环迭代中,每次从a或b中取一个节点插入到结果链表的尾部,循环结束时,虚拟节点的next域就是结果链表的地址,也就是我们期望的返回值。
方法2(局部引用)
这种方法与上一种方法非常相似。这种方法避免使用虚拟节点(dummy node),而是使用一个指向指针的指针,struct node** lastPtrRef,这个指针指向结果链表的最后一个节点。在这个方法中,所有由虚拟节点完成的工作都有lastPtrRef完成。
方法3(递归)
合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。尽管如此,你可能也不愿意使用递归来实现这个操作,因为递归方法所使用的栈空间与链表的长度成正比。
原文网址:http://www.geeksforgeeks.org/archives/3622
- 将两个有序链表合并成一个新的有序链表
- Java将两个有序链表合并为一个有序链表、将两个有序数组合并成一个有序数组
- 有序的合并两个有序链表
- 两个有序链表合并成一个有序链表
- 合并两个有序链表形成一个新的有序链表
- 将两个递增的有序链表合并为一个递增的有序链表
- 将两个有序链表合并成一个有序链表
- 将两个有序链表合并成一个有序链表
- 将两个有序链表合并成一个有序链表
- 将两个有序链表合并成一个有序链表
- 将两个有序链表合并成一个有序链表
- 将两个有序链表合并成一个有序链表
- 如何将两个有序链表合并成一个有序链表。
- 将两个单向有序链表合并成一个单向有序链表
- 将两个有序链表合并成一个有序链表
- 两个有序链表合并成一个新的链表,合成的链表一样有序排列
- java编程实现将两个有序链表LA,LB合并成新的LA
- 将两个有序链表进行合并
- mysql中orderby和limit同时使用的bug
- 辅助功能——final关键字+对象的多态性
- UVA - 227 Puzzle
- 聪明一点的NPC寻路
- JQuery 学习笔记
- 将两个有序链表合并成一个新的有序链表
- Android Fragment 真正的完全解析(下)
- 创建博客-完善关注功能(2)
- 自定义控件RadioButton EditText
- 图解FFMPEG打开媒体的函数avformat_open_input
- 欢迎使用CSDN-markdown编辑器
- UVA - 232 Crossword Answers
- 有时候思维局限真的很无奈
- 【js】JSON.stringify 语法实例讲解