单链表的合并(递归、非递归)

递归方法将两个链表合并成一个链表

例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点

假设以下两个链表:

链表1:1->3->5

链表2:2->4->6

(1)比较1和链表2的第一个节点数据,由于1<2,因此把结果链表头结点指向链表1中的第一个节点,即数据1所在的节点

(2)对剩余的链表1(3->5)和链表2在调用本过程,比较得到结果链表的第二个节点,即2与3比较得到2,此时合并后的链表节点为1->2,这样

递归知道两个链表的节点都被加到结果链表中。

node *mergerecursive(node *head1,node *head2)

{

if(head1==NULL)

{

return head2;

}

if(head2==NULL)

{

return head1;

}

node *head=NULL;

if(head->data<head2->data)

{

head=head1;

head->next=mergerecursive(head1->next,head2);

}

else

{

head=head2;

head->next=mergerecursive(head1,head2->next);

}

return head;

}

非递归方式合并:

例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点

因为head1和head2是有序的,所以只需要把较短链表的各个元素有序的插入到较长的链表之中就可以了

node *t_node(node *head,node *item)

{

node *p=head;

node *q=NULL;//始终指向p之前的节点

while(p->data<item->data&&p!=NULL)

{

q=p;

p=p->next;

}

if(p=head)插入到原头结点之前

{

item->next=p;

return item;

}

插入到p与q之间

q->next=item;

item->next=p;

return head;

}

合并单链表

node merge(node *head1,node *head2)

{

node *head;//合并后的头指针

node *p;

node *nextp;//指向p之后

if(head1==NULL)//一个链表为空返回另一个链表

{

return head2;

}

else if(head2==NULL)//一个链表为空返回另一个链表

{

return head1;

}

两个链表都不为空

if(length(head1)>=length(head2))//length()函数测单链表的长度,函数的使用见我的博客

{

head=head1;

p=head2;

}

else

{

head=head2;

p=head1;

}

while(p!=NULL)

{

nextp=p->next;//

head=insert_node(head ,p);

p=nextp;//指向要插入的下一个节点

}

return head;

}

单链表的合并(递归、非递归)

时间: 2024-10-27 00:48:03

单链表的合并(递归、非递归)的相关文章

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

合并两个有序的单链表,合并之后的链表依然有序【出现频率高】

合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察. 例如: 链表1:   1->2->3->4 链表2:   2->3->4->5 合并后:   1->2->2->3->3->4->4->5 解题思路:   挨着比较链表1和链表2.   这个类似于归并排序.尤其要注意两个链表都为空.和其中一个为空的情况.只需要O (1) 的空间.时间复杂度为O (max(len1,len2)) public Node me

数据结构学习之单向链表的基本操作(非递归实现)

[摘要]本文讨论的均为带头结点的线性链表的基本操作,包括创建.删除.插入.打印等等,欢迎大家批评指正错误. (1)单链表存储结构 typedef struct LNode { int data; struct LNode *next; }LinkList; (2)创建链表 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode));

两个有序单链表的合并

已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序这个类似归并排序.尤其注意两个链表都为空,和其中一个为空时的情况.只需要O(1)的空间.时间复杂度为O(max(len1, len2)) 1 public static Node mergeSortedList(Node head1, Node head2) { 2 // 其中一个链表为空的情况,直接返回另一个链表头,O(1) 3 if (head1 == null) { 4 return head2; 5 } 6

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr

排序算法 归并算法(递归+非递归)

部分理论和图来自:http://www.cnblogs.com/jingmoxukong/p/4308823.html  (侵删) 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. 归并排序的基本思想 将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,

归并排序 - 递归非递归实现java

1.归并排序思想: 以2路归并为例,一个有n个记录的序列可以看作n个长度为1的有序子序列,将其两两合并成n/2(向上取整)个长度为2或1的有序序列,当有奇数个记录时为1,重复归并,直到得到一个长度为n的有序序列. 2.归并排序的复杂度: 递归:时间复杂度O(nlongn),空间复杂度O(n+longn) 非递归:时间复杂度O(nlongn),空间复杂度O(n) 所以用到归并排序,还是优先考虑非递归吧.  3.递归实现 1 public void mergeSort1(int[] data){ 2