合并两个有序单链表
Posted peiyao456
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并两个有序单链表相关的知识,希望对你有一定的参考价值。
给出两个有序的单链表,将这两个单链表进行合并,合并出来的链表仍然是有序的。
比如给出链表1:1->3->6->7;链表2:2->4->5->8->9
合并后的链表为:1->2->3->4->5->6->7->8->9
代码展示如下(只给出实现部分)
结构体定义:
typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode,*pLinkNode; typedef struct LinkList { LinkNode *pHead; }LinkList,*pLinkList;
函数实现:
pLinkNode MergeLinkList(pLinkList l1, pLinkList l2) { assert(l1 && l2); pLinkNode cur1 = l1->pHead; pLinkNode cur2 = l2->pHead; pLinkNode p = NULL; pLinkNode tail = NULL; //处理异常情况 if (NULL == cur1 && NULL == cur2) { return NULL; } if (cur1 == NULL) { return cur2; } if (NULL == cur2) { return cur1; } if (cur1->data < cur2->data) { p = cur1; cur1 = cur1->next; tail = p; } else { p = cur2; cur2 = cur2->next; tail = p; } while (cur1 && cur2) { if (cur1->data < cur2->data) { tail->next = cur1; cur1 = cur1 -> next; tail = tail->next; } else { tail->next = cur2; cur2 = cur2->next; tail = tail->next; } } while (cur1) { tail->next = cur1; break; } while (cur2) { tail->next = cur2; break; } return p; }
代码分析:程序开始先进行异常处理。最后的两个while循环最多只能执行一个,也有都
不执行的情况。这个比较好理解,就不说了。
基于上边的方法,我们可以类似处理这样的问题:合并两个有序数组,并将合并结
果 放在数组1中(数组1足以存储两个数组的所有元素)。下边看代码:
void merge(int num1[], int m, int num2[], int n) { assert(m>0&&n>0); int i = 0; int j = 0; int k = 0; int *arr = (int *)malloc(sizeof(int)*(m+n)); while (i < m&&j < n) { if (num1[i] < num2[j]) { arr[k] = num1[i]; k++; i++; } else { arr[k] = num2[j]; k++; j++; } } while (i < m) { arr[k++] = arr[i++]; } while (j < n) { arr[k++] = arr[j++]; } memcpy(num1,arr,10*sizeof(int)); }
为了减少元素的移动次数,我们用空间换时间-----开辟一个新的数组,用来保存合并后
的元素,最后用内存拷贝函数将新数组中的元素拷贝到数组1中。
以上是关于合并两个有序单链表的主要内容,如果未能解决你的问题,请参考以下文章