生活随笔
收集整理的這篇文章主要介紹了
将两个有序链表合并为一个链表任然有序C语言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將兩個有序鏈表合并為一個鏈表任然有序,兩個鏈表都是從大到小或者從小到大。
方法:
1.將兩個鏈表連起來,對所有元素進行排序。
2.因為兩個鏈表的長度可能不同,則將兩鏈表相同長度的一部分進行排序,將較長鏈表的后邊直接連接在排好序的鏈表后邊
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{int data;struct Node *next;
}Node;
Node* Hebing(Node* head1, Node* head2)? //合并兩個有序鏈表成一個有序鏈表
{if(head1 == NULL)return head2;if(head2 == NULL)return head1;Node *head, *p1, *p2;if(head1->data < head2->data)?? //確定好合并后的頭結點 (從小到大) {head = head1;p1 = head1->next;p2 = head2;}else{head = head2;p1 = head1;p2 = head2->next;}?Node *move = head;?? //定義一個臨時指針,(不用創建新鏈表占用空間)將兩個鏈表連接在一起while(p1 && p2)????? //p1,p2都不為空 {if(p1->data <= p2->data){move->next = p1;move = p1;p1 = p1->next;}else{move->next = p2;move = p2;p2 = p2->next;}}if(p1)?? //p1比p2長,比較完最小長度的鏈表節點后,因為有序,剩下的直接加到比較完的后邊 move->next = p1;???? // 補齊p1剩余未比較的節點if(p2)move->next = p2;???? // 補齊p2剩余未比較的節點return head;
}
Node* Creat()????? //鏈表的創建
{Node *head,*p,*s;head =(struct Node *)malloc(sizeof(struct Node));int x,flag = 1;if(head == NULL)printf("頭結點創建失敗!\n");p = head;?? //p永遠指向head的尾部 printf("輸入(以0結束,從小到大):");while(flag){scanf("%d",&x);if(x != 0){s =(struct Node *)malloc(sizeof(struct Node));s->data = x;p->next = s;p = s;?}elseflag = 0;??}head = head->next;p->next = NULL;printf("鏈表建立成功!\n");?return head;?
}
void Print(Node *head)
{Node *p = head;while(p!=NULL){printf("%d? ",p->data);p = p->next;}//printf("\n");
}
int main()
{Node *head1 = Creat();Node *head2 = Creat();Node *head3 = Hebing(head1, head2);Print(head3);return 0;
}
總結
以上是生活随笔為你收集整理的将两个有序链表合并为一个链表任然有序C语言的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。