两个单链表合并问题
来源:互联网 发布:minitab软件 编辑:程序博客网 时间:2024/06/03 19:42
链表的结点如下所示,已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。
struct Node{ int data ; Node *next ;};typedef struct Node Node ;
单链表合并代码,非递归方式
Node * Merge(Node *head1 , Node *head2){ if ( head1 == NULL ) //head1为空 return head2 ; if ( head2 == NULL) //head2为空 return head1 ; Node *head = NULL ; Node *p1 = NULL; Node *p2 = NULL; //数据链表第一个结点小的做首结点 if ( head1->data < head2->data ) { head = head1 ; p1 = head1->next; p2 = head2 ; } else { head = head2 ; p2 = head2->next ; p1 = head1 ; } Node *pcurrent = head ; //当p1移到末尾或p2移到末尾 while ( p1 != NULL && p2 != NULL) { if ( p1->data <= p2->data ) { pcurrent->next = p1 ; pcurrent = p1 ; p1 = p1->next ; } else { pcurrent->next = p2 ; pcurrent = p2 ; p2 = p2->next ; } } //p1没有移到末尾,将p1添加到新链表后面 if ( p1 != NULL ) pcurrent->next = p1 ; //p2没有移到末尾,将p2添加到新链表后面 if ( p2 != NULL ) pcurrent->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->data < head2->data ) { head = head1 ; head->next = MergeRecursive(head1->next,head2); } else { head = head2 ; head->next = MergeRecursive(head1,head2->next); } return head ;}
测试代码如下所示
#include <iostream>using namespace std;struct Node{ int data ; Node *next ;};typedef struct Node Node ;//创建链表节点Node* CreateNode(){ Node *head = NULL; Node *pnew = NULL; Node *tail = NULL; int d; while(1) { cin >> d; if (d==0) break; pnew = new Node; pnew->data = d; pnew->next = NULL; if(head == NULL) { head = pnew; tail = pnew; } else { tail->next = pnew; tail = pnew; } } return head;}void PrintList(Node *head){ if (head== NULL) return ; while(head) { cout << head->data << " "; head = head->next; } cout << endl;}//单链表合并,非递归方式 Node * Merge(Node *head1 , Node *head2){ if ( head1 == NULL ) //head1为空 return head2 ; if ( head2 == NULL) //head2为空 return head1 ; Node *head = NULL ; Node *p1 = NULL; Node *p2 = NULL; //数据链表第一个结点小的做首结点 if ( head1->data < head2->data ) { head = head1 ; p1 = head1->next; p2 = head2 ; } else { head = head2 ; p2 = head2->next ; p1 = head1 ; } Node *pcurrent = head ; //当p1移到末尾或p2移到末尾 while ( p1 != NULL && p2 != NULL) { if ( p1->data <= p2->data ) { pcurrent->next = p1 ; pcurrent = p1 ; p1 = p1->next ; } else { pcurrent->next = p2 ; pcurrent = p2 ; p2 = p2->next ; } } //p1没有移到末尾,将p1添加到新链表后面 if ( p1 != NULL ) pcurrent->next = p1 ; //p2没有移到末尾,将p2添加到新链表后面 if ( p2 != NULL ) pcurrent->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->data < head2->data ) { head = head1 ; head->next = MergeRecursive(head1->next,head2); } else { head = head2 ; head->next = MergeRecursive(head1,head2->next); } return head ;}int main(int argc, char ** argv){ Node *head1 = CreateNode(); Node *head2 = CreateNode(); cout << "合并:" << endl; PrintList(Merge(head1,head2)); Node *head3 = CreateNode(); Node *head4 = CreateNode(); cout << "合并:" << endl; PrintList(MergeRecursive(head3,head4)); return 0;}
测试结果如下所示
阅读全文
0 0
- 两个单链表合并问题
- 两个LIST合并问题
- 两个list合并的问题
- 两个list合并的问题
- 合并两个有序单链表
- 合并两个有序单链表
- 两个单链表的合并
- 合并两个有序单链表
- 两个有序单链表合并
- 两个单链表合并
- 合并两个有序单链表
- 合并两个有序单链表
- 合并两个有序单链表
- 合并两个循环单链表
- 合并两个有序单链表
- 合并两个单链表算法
- 两个单链表合并
- [SCU2016年题]有两个已排序的单链表,合并问题
- HDU 5721 Palace 平面最近点对
- 【Spring Boot】web应用开发-Servlets, Filters, listeners
- 栈
- spoj 375 QTREE
- kubernetes源码阅读之kubelet pod之来源
- 两个单链表合并问题
- padans中Serise.name的用法意义
- 数据结构与算法·实验三
- 数据结构4————递归解决迷宫问题和马踏棋盘
- Android应用层通信机制
- python基础学习笔记(三)
- React项目开发,你需要知道哪些
- 【Spring Boot】完美使用FastJson解析JSON数据
- 如果有人问你数据库的原理,叫他看这篇文章