编程实现合并两个有序单链表
2012-02-29 20:11
615 查看
编程实现合并两个有序(假定为降序)单链表的函数,输入为两个有序链表的头结点,函数返回合并后新的链表的头节点,
要求:不能另外开辟新的内存存放合并的链表。
合并函数声明如下:node *merge_sorted_list( node * head1, node *head2);
//重要方法:
采用递归的方法实现:
//掌握好了 吗?
要求:不能另外开辟新的内存存放合并的链表。
合并函数声明如下:node *merge_sorted_list( node * head1, node *head2);
//重要方法:
node merge_sorted_list(const node head1,const node head2) { if((NULL == head1) && (NULL == head1)) { return NULL; } else if(NULL == head1) { return head2; } else if(NULL == head2) { return head1; } else { node head = NULL,p1 = NULL,p2 = NULL; if(head1->value >= head2->value) { head = head1; p1 = head1->next; p2 = head2; } else { head = head2; p2 = head2->next; p1 = head1; } node p = head; while((NULL != p1) && (NULL != p2)) { if(p1->value >= p2->value) { p->next = p1; p = p1; p1 = p1->next; } else { p->next = p2; p = p2; p2 = p2->next; } } p->next = p1 ? p1 : p2; //if(NULL != p1->next) // p->next = p1; //else // p->next = p2; return head; } }
采用递归的方法实现:
Node * MergeRecursive(Node *head1 , Node *head2) { if ( head1 == NULL ) return head2 ; if ( head2 == NULL) return head1 ; Node *head = NULL ; if ( head1->value > head2->value ) { head = head1 ; head->next = MergeRecursive(head1->next,head2); } else { head = head2 ; head->next = MergeRecursive(head1,head2->next); } return head ; }
//掌握好了 吗?
//不带头节点的链表 #include <stdio.h> #include <malloc.h> struct Node { int value; struct Node *next; }; typedef struct Node * node; node CreateList(int iStart,int num) { node head = NULL,p = NULL,q = NULL; for(int i = num;i > 0 ;i --) { p = (node)malloc(sizeof(struct Node)); p->value = iStart + i; if(head == NULL) { head = p; } else { q->next = p; } q = p; } p->next = NULL; return head; } node merge_sorted_list(node head1,node head2) { if((NULL == head1) && (NULL == head2)) { return NULL; } else if(NULL == head1) { return head2; } else if(NULL == head2) { return head1; } else { node p = NULL,p1 = NULL,p2 = NULL; if(head1->value >= head2->value) { p = head1; p1 = head1->next; p2 = head2; } else { p = head2; p2 = head2->next; p1 = head1; } while((NULL != p1) && (NULL != p2)) { if(p1->value >= p2->value) { p->next = p1; p = p1; p1 = p1->next; } else { p->next = p2; p = p2; p2 = p2->next; } } p->next = p1 ? p1 : p2; return head1->value >= head2->value ? head1 : head2; } } void display(node head) { node p = head; while(NULL != p) { printf("%3d",p->value); p = p->next; } printf("\n"); } int main() { node head1 = NULL ,head2 = NULL,head = NULL; head1 = CreateList(5,6); head2 = CreateList(5,6); display(head1); display(head2); head = merge_sorted_list(head1,head2); display(head); return 0; }
相关文章推荐
- 编程实现合并两个有序单链表
- 编程实现两个有序单链表的合并
- 两个有序单链表合并成一个有序单链表的java实现
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- Java 非递归 和非递归方法 实现两个有序单链表的合并
- 单链表操作之合并两个有序单链表---递归 and 非递归实现
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- java编程实现将两个有序单链表LA,LB合并成新的LA
- 将两个非递减的有序链表合并为一个非递增的有序链表(C语言编程实现)
- 实现两个有序单链表的合并。要求:随机创建两个单链表,实现单链表的排序,再对两个有序单链表进行合并。
- 两个有序单链表合并成一个有序单链表的java实现
- 用C#实现单链表(merge两个有序单链表)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 合并两个有序单链表
- 单链表(创建,打印,逆序,合并两个有序的链表)
- 合并两个有序单链表(Java)
- java实现把两个有序数组合并到一个数组的实例
- C语言实现:合并两个有序的数组,合并后的数组依然有序
- 合并两个有序单链表