将两个有序链表合并,合并后仍然有序
生活随笔
收集整理的這篇文章主要介紹了
将两个有序链表合并,合并后仍然有序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
思路:因為A,B鏈表中元素遞增有序,要使歸并后的C也遞增有序,可以每次從A、B中挑出最小的元素插入C的尾部,這樣循環插入完成后,C也一定是遞增有序的。
需要注意的點是,A、B中的元素有可能一個已經全部被插入到C中,而另一個還沒插完。
1 struct LNode{ 2 int data; 3 LNode *next; 4 } 5 6 void Merge(LNode *A,LNode *B,LNode *&C) 7 { 8 LNode *p = A->next; // 定義p結點跟蹤 A中的結點 9 LNode *q = B->next; // 定義q結點跟蹤 B中的結點 10 11 C = A; 12 C->next = NULL; 13 free(B); 14 15 LNode *r = C; // 定義一個跟蹤結點,永遠指向C的終端結點 16 17 while(p!=NULL&&q!=NULL){ 18 if(p->data <= q->data){ 19 r->next = p; 20 p = p->next; 21 r = r->next; 22 }else{ 23 r->next = q; 24 q = q->next; 25 r = r->next; 26 } 27 } 28 29 if(p!=NULL) r->next = p; 30 if(q!=NULL) r->next = q; 31 }?
如果題這樣改:A、B遞增有序,合并成C后,C遞減有序,怎么做?? ? 前面題用的是尾插法插入元素,如果使用頭插法插入元素,就可以得到一個遞減序列。
1 struct LNode{ 2 int data; 3 LNode *next; 4 } 5 6 void merge(LNode *A,LNode *B,LNode *&C) 7 { 8 LNode *p = A->next; 9 LNode *q = B->next; 10 LNode *s; 11 C = A; // 使用A的頭結點作為C的頭結點,然后建立一個空鏈表 12 C->next= NULL; 13 free(B); // 釋放B的頭結點 14 15 while(p!=NULL&&q!=NULL){ 16 if(p->data<=q->data){ 17 s = p; 18 p = p->next; 19 s->next = C->next; 20 C->next = s; 21 }else{ 22 s = q; 23 q = q->next; 24 s->next = C->next; 25 C->next = s; 26 } 27 } 28 while(p!=NULL){ 29 s = p; 30 p = p->next; 31 s->next = C->next; 32 C->next = s; 33 } 34 while(q!=NULL){ 35 s = q; 36 q = q->next; 37 s->next = C->next; 38 C->next = s; 39 } 40 }?
轉載于:https://www.cnblogs.com/ll-10/p/9698815.html
總結
以上是生活随笔為你收集整理的将两个有序链表合并,合并后仍然有序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库时间设置
- 下一篇: 可迭代对象、迭代器与生成器