有序单链表的合并就是两个之前都已排好序的链表,将它们合并成一个链表。合并的过程中对于两个链表值相等的结点也要链到最终的链表中去。
源代码如下:
#include <stdio.h> #include <malloc.h> struct Node{ int data; Node *next; }; typedef struct Node Node; Node *Merge(Node *head1,Node *head2) { Node *p1 = NULL; Node *p2 = NULL; Node *head = NULL; //找出两个链表中第一个结点较小的结点,head记录较小结点的头结点 if(head1->next->data < head2->next->data) { head = head1; p1 = head1->next; p2 = head2->next; } else { head = head2; p2 = head2->next; p1 = head1->next; } Node *pcur = head; //在两个链表中遍历比较,将值较小的结点链接到pcur结点后 while(p1 != NULL && p2 != NULL) { if(p1->data <= p2->data) { pcur->next = p1; pcur = p1; p1 = p1->next; } else { pcur->next = p2; pcur = p2; p2 = p2->next; } } //将p1或p2剩余的结点链到pcur之后,完成整个合并的过程 if(p1 != NULL) pcur->next = p1; if(p2 != NULL) pcur->next = p2; return head; } int main() { Node *head1 = NULL; Node *node1 = NULL,*node2 = NULL,*node3 = NULL,*node4 = NULL; head1 = (Node *)malloc(sizeof(Node)); node1 = (Node *)malloc(sizeof(Node)); node2 = (Node *)malloc(sizeof(Node)); node3 = (Node *)malloc(sizeof(Node)); node4 = (Node *)malloc(sizeof(Node)); node1->data = 1; node2->data = 2; node3->data = 3; node4->data = 4; head1->next = node1; node1->next = node2; node2->next = node3; node3->next = node4; node4->next = NULL; Node *head2 = NULL; Node *node5 = NULL,*node6 = NULL,*node7 = NULL,*node8 = NULL; head2 = (Node *)malloc(sizeof(Node)); node5 = (Node *)malloc(sizeof(Node)); node6 = (Node *)malloc(sizeof(Node)); node7 = (Node *)malloc(sizeof(Node)); node8 = (Node *)malloc(sizeof(Node)); node5->data = 3; node6->data = 4; node7->data = 5; node8->data = 6; head2->next = node5; node5->next = node6; node6->next = node7; node7->next = node8; node8->next = NULL; Node *ptr; ptr = Merge(head1,head2); ptr = ptr->next; while(ptr != NULL) { printf("%d ",ptr->data); ptr = ptr->next; } printf("/n"); return 0; }
两个有序单链表的合并
最新推荐文章于 2024-08-02 17:45:21 发布