1. 程式人生 > >劍指offer面試題17-:合併兩個排序連結串列

劍指offer面試題17-:合併兩個排序連結串列

將兩個已經排好序的連結串列(升序)進行合併,使得合併後的連結串列仍然有序。

假設兩個連結串列分別為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);