每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写。

今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来。

代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^。

在Linux/g++下编译运行成功。

合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾。


  1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 typedef struct Node
5 {
6 int data;
7 Node* next;
8 }Node, *List;
9
10 void sortList(List aList) //对随机数字链表排序
11 {
12 if(aList == NULL)
13 return;
14
15 List pT = aList->next;
16 aList->next = NULL;
17 while ( pT != NULL )
18 {
19 List pr = pT;
20 List pU = pT;
21 List pN = NULL;
22 while ( pU->next != NULL )
23 {
24 if ( pr->data <= pU->next->data )
25 {
26 pN = pU;
27 pr = pU->next;
28 }
29
30 pU = pU->next;
31 }
32
33 if ( pN != NULL )
34 {
35 pN->next = pr->next;
36 }
37 else
38 {
39 pT = pT->next;
40 }
41 pr->next = aList->next;
42 aList->next = pr;
43 }
44 }
45
46 List createList(int num) //随机生成数字,构造链表
47 {
48 List aList = (List)malloc(sizeof(Node));
49 aList->next = NULL;
50 aList->data = 0;
51 Node* qT = aList;
52
53 // srand((int)time(0));
54 for ( int i=0; i< num; ++i)
55 {
56 Node* pTN = (Node*)malloc(sizeof(Node));
57 pTN->data = rand()%100;
58 pTN->next = NULL;
59 qT->next = pTN;
60 qT = pTN;
61 }
62 sortList(aList);
63 return aList;
64 }
65
66 void printList(List aList) //打印链表
67 {
68 if ( aList == NULL || aList->next == NULL )
69 return;
70
71 Node* pT = aList->next;
72 printf("element of list:\n\t");
73 while( pT != NULL )
74 {
75 printf("%d ", pT->data);
76 pT = pT->next;
77 }
78
79 printf("\n");
80 }
81
82 void deleteList(List aList) //删除链表
83 {}
84
85 void mergeList(List aList, List bList) //合并链表
86 {
87 if ( aList == NULL || bList == NULL )
88 return;
89
90 Node* pA = aList->next;
91 Node* pB = bList->next;
92 Node* pT = NULL;
93 Node* pN = bList;
94 bList->next = NULL;
95 delete aList;
96
97 while ( pA != NULL && pB != NULL )
98 {
99 if ( pA->data < pB->data )
100 {
101 pT = pA->next;
102 pA->next = pN->next;
103 pN->next = pA;
104 pN = pN->next;
105 pA = pT;
106 }
107 else
108 {
109 pT = pB->next;
110 pB->next = pN->next;
111 pN->next = pB;
112 pN = pN->next;
113 pB = pT;
114 }
115 }
116
117 if ( pA == NULL )
118 {
119 pN->next = pB;
120 }
121
122 if ( pB == NULL )
123 {
124 pN->next = pA;
125 }
126 }
127
128 int main(int argc, char const *argv[])
129 {
130 srand((int)time(0));
131 List aList = createList(5);
132 List bList = createList(7);
133 printList(aList);
134 printList(bList);
135
136 mergeList(aList, bList);
137 printList(bList);
138
139 deleteList(bList);
140
141 return 0;
142 }

每天一个小算法(2)----合并两个有序链表,布布扣,bubuko.com

时间: 2024-12-23 11:00:22

每天一个小算法(2)----合并两个有序链表的相关文章

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

经典算法学习——合并两个有序链表

类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型.题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的.我这里以合并链表来实现. 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表.简单的示意图如下: 当下一个节点在第一个链表中时,Node3指向该节点,Node1++,以此类推.直到某一个链表为空时,把另一个链表全部接

C++算法之 合并两个有序链表

题目:合并两个已经排序好的链表 方法1: 两个链表 比如链表1: 1->3->5->7->9 链表2:  2->4->6->8->10 跟我们合并两个数组一样,链表1的头结点  和链表2的头节点比较,如果链表1头节点的值大于链表2头接点的值, 那么链表2的头结点为合并链表的头结点,那么链表1的头节点继续和链表2的第二个节点(剩余链表2的头结点) 作比较,但一个链表遍历完之后,如果另外一个链表还没有遍历完,因为链表本来就是排序的,所以让合并链表的 尾巴节点指向

每天一个小算法(3)----倒序打印链表

这个比较简单,用栈.递归.倒转链表都可以实现,不再过多解释. 代码使用递归实现 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 typedef struct Node 5 { 6 int data; 7 Node* next; 8 }Node, *List; 9 10 11 List createList(int num) //随机生成数字,构造链表 12 { 13 List aList

算法题——合并两条有序的链表

题目:给定两个已排序的链表,返回合并后的链表. 思路:将链表L2的每个结点插入到链表L1中,时间复杂度为O(m+n),m.n分别为两条链表的长度. 代码: 1 struct ListNode 2 { 3 int value; 4 ListNode *next; 5 ListNode(int v): value(v), next(NULL) 6 { 7 } 8 }; 9 10 ListNode *mergeSortedList(ListNode *L1, ListNode *L2) 11 { 12

[leetcode] 21. 合并两个有序链表

21. 合并两个有序链表 两个有序链表合并为一个新的有序链表 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode ans = new ListNode(Integer.MAX_VALUE); ListNode p = ans; while (l1 != null && l2 != null) { if (l1.val < l2.val) { p.next = l1; l

[LeetCode]21 Merge Two Sorted Lists 合并两个有序链表

---恢复内容开始--- [LeetCode]21 Merge Two Sorted Lists 合并两个有序链表 Description Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. Example Example: Input: 1->2->4, 1-&g

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head

LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode21. Merge Two Sorted Lists 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 Java 实现 ListNode 类 class ListNode { int val; ListNode n