每天一个小算法(2)----合并两个有序链表
2014-06-12 11:01
417 查看
每天一个小算法还是有点没时间,尽量抽出时间写一写。
今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来。
代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^。
在Linux/g++下编译运行成功。
合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾。
今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来。
代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^。
在Linux/g++下编译运行成功。
合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾。
#include <stdio.h> #include <time.h> #include <stdlib.h> typedef struct Node { int data; Node* next; }Node, *List; void sortList(List aList) //对随机数字链表排序 { if(aList == NULL) return; List pT = aList->next; aList->next = NULL; while ( pT != NULL ) { List pr = pT; List pU = pT; List pN = NULL; while ( pU->next != NULL ) { if ( pr->data <= pU->next->data ) { pN = pU; pr = pU->next; } pU = pU->next; } if ( pN != NULL ) { pN->next = pr->next; } else { pT = pT->next; } pr->next = aList->next; aList->next = pr; } } List createList(int num) //随机生成数字,构造链表 { List aList = (List)malloc(sizeof(Node)); aList->next = NULL; aList->data = 0; Node* qT = aList; // srand((int)time(0)); for ( int i=0; i< num; ++i) { Node* pTN = (Node*)malloc(sizeof(Node)); pTN->data = rand()%100; pTN->next = NULL; qT->next = pTN; qT = pTN; } sortList(aList); return aList; } void printList(List aList) //打印链表 { if ( aList == NULL || aList->next == NULL ) return; Node* pT = aList->next; printf("element of list:\n\t"); while( pT != NULL ) { printf("%d ", pT->data); pT = pT->next; } printf("\n"); } void deleteList(List aList) //删除链表 {} void mergeList(List aList, List bList) //合并链表 { if ( aList == NULL || bList == NULL ) return; Node* pA = aList->next; Node* pB = bList->next; Node* pT = NULL; Node* pN = bList; bList->next = NULL; delete aList; while ( pA != NULL && pB != NULL ) { if ( pA->data < pB->data ) { pT = pA->next; pA->next = pN->next; pN->next = pA; pN = pN->next; pA = pT; } else { pT = pB->next; pB->next = pN->next; pN->next = pB; pN = pN->next; pB = pT; } } if ( pA == NULL ) { pN->next = pB; } if ( pB == NULL ) { pN->next = pA; } } int main(int argc, char const *argv[]) { srand((int)time(0)); List aList = createList(5); List bList = createList(7); printList(aList); printList(bList); mergeList(aList, bList); printList(bList); deleteList(bList); return 0; }
相关文章推荐
- 数据结构——算法之(033)(两个有序单链表合并为一个有序的单链表)
- 每天一个算法之合并有序链表
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 每天一道LeetCode-----合并两个/多个有序链表为一个新链表
- 将两个有序链表合并成一个有序链表——搜狐畅游笔试题归来
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。
- 递归合并两个有序链表为一个有序链表
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- 两个有序链表合并为一个有序链表
- 用递归方法实现两个链表head1和head2各自有序,请把它们合并成一个链表仍然有序。(c/c++)
- 合并两个有序链表的算法
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 将两个有序链表合并成一个有序链表——搜狐畅游笔试题归来
- 两个有序链表合并算法
- 3.两个有序单链表合并为一个有序的单链表
- 9、单链表的合并,两个有序单链表,合并为一个有序链表。
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(保留所有结点,即便大小相同)
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- 已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序,要求用递归方法进行。
- 将两个有序链表合并为一个有序链表