劍指offer面試題17-:合併兩個排序連結串列
阿新 • • 發佈:2019-02-04
將兩個已經排好序的連結串列(升序)進行合併,使得合併後的連結串列仍然有序。
假設兩個連結串列分別為A和B,我的思路是將使用兩個指標p和q掃描兩個連結串列各一遍,將B連結串列中的元素插入到A中,最終形成一個新的連結串列。
邊界條件:(1)連結串列為空時;
(2)開始時,A中第一個節點的值 < B中第一個節點的值;
(3)掃描完一個連結串列而另一個沒有掃描完;
兩個連結串列的初始狀態:
由於B中第一個節點值為13比A中的小,所以將其作為A的第一個節點:
當p指向A中某個節點的值>q指向的值時,我們要藉助於一個p的前驅指標pPre來改變指標的指向。詳細程式碼如下:
linkNode* mergeLinkList(linkNode *&A, linkNode * &B) { if (A == NULL) return B; if (B == NULL) return A; linkNode *p = A, *pPre = NULL; linkNode *q = B; while (p != NULL && q != NULL) { if (p->data <= q->data)//當p指向節點的值<=q指向的節點的值時,後移p指標 { pPre = p; p = p->next; } else if (pPre == NULL)//說明連結串列A中的第一個節點中的值 < B連結串列中第一個節點值 { linkNode *n = q->next; q->next = p; p = q; q = n; A = p; } else//p指向A的中間一個節點,p指向的值 > q指向的值 { linkNode *n = q->next; pPre->next = q; q->next = p; pPre = q; q = n; } } if (q == NULL)//後續處理,當q為空時 return A; else//p為空時 { pPre->next = q; return A; } }
假設A中有m個點,B中有n個節點,那麼最壞情況下的時間是掃描一遍A和B所用的時間,即為O(m+n);