鍊錶相關考題

2022-03-11 07:38:27 字數 3378 閱讀 3404

問題描述:

現有兩個公升序鍊錶,且鍊錶中均無重複元素。請設計乙個高效的演算法,列印兩個鍊錶的公共值部分。

給定兩個鍊錶的頭指標headaheadb,請返回乙個vector,元素為兩個鍊錶的公共部分。請保證返回陣列的公升序。兩個鍊錶的元素個數均小於等於500。保證一定有公共                   值測試樣例:

,
返回:[2.4.6]

方法:兩個頭指標分別指向表頭,哪個結點元素小,哪個指標前移,如果相同,則都前移,任意乙個鍊錶走完,函式停止。

public

int findcommonparts(listnode heada, listnode headb)

else

if(heada.valheada.next;

else

headb=headb.next;

}int array=new

int[arr.size()];

for(int i=0;iarr.get(i);

return

array;

}

問題:有乙個單鏈表,請設計乙個演算法,使得每k個節點之間逆序,如果最後不夠k個節點一組,則不調整最後幾個節點。例如鍊錶1->2->3->4->5->6->7->8->null,k=3這個例子。調            整後為,3->2->1->6->5->4->7->8->null。因為k==3,所以每三個節點之間逆序,但其中的7,8不調整,因為只有兩個節點不夠一組。

給定乙個單鏈表的頭指標head,同時給定k值,返回逆序後的鍊錶的頭指標。

方法:利用棧的特性,對k個元素進行反轉

public listnode inverse(listnode head, int

k) }

else

}if(top==k-1)

else

lastgrouphead.next=null

;

return

newhead.next;

}

方法1:t=o(n),s=o(n), 利用棧把鍊錶每個元素入棧,然後依次出棧和鍊錶元素對比。

方法2:t=o(n/2),s=o(n),設定兩個指標,乙個快指標(一次前進兩步),乙個慢指標,目的是找到鍊錶的中間的位置。

分析:當鍊表元素個數為奇數時,快指標.next=null時(一定會走到.next=null),則此時移動後的慢指標就是中間位置。

當偶數時,快指標=null時(必然會走到null),移動前的慢指標就是中間兩個元素的左邊位置。

當得到中間位置的指標時,只需將一半的鍊錶入棧,進行對比。

方法3:t=o(n),s=o(1),將後半部分指標翻轉,如 1->2->3->2->1 變換成1->2->3

public static boolean ispalindrome(listnode phead) 

listnode right;

//從slow開始翻轉(如果是偶數,如1,2,3,3,2,1,奇數時如1,2,3,2,1 右半部分都是1,2,3

//無論是奇是偶,只需把右半部分比較完即可

right=reverse(slow);

listnode current=phead;

while(right!=null

)

return

true

; }

//翻轉右半部分

public

static

listnode reverse(listnode head)

return

n2; }

方法**:

}問題:如何判斷乙個單鏈表是否有環?有環的話返回進入環的第乙個節點的值,無環的話返回-1。

如果鍊錶的長度為n,請做到時間複雜度o(n),額外空間複雜度o(1)。

分析:如果不做空間上的限制,可以使用雜湊表來輔助,當乙個節點重複出現時,即是環的入口。

當限制空間時,採用兩個指標,快和慢,當快指標和慢指標相交時,即表示有環,此時讓快指標回頭開始位置,兩個指標每次走一步,

當相交時,即進入環(此方法的數學證明略)

**:

public

int chkloop(listnode head, int

adjust)

return

fast.val;}}

return -1;

}

問題:現在有兩個無環單鏈表,若兩個鍊錶的長度分別為m和n,請設計乙個時間複雜度為o(n + m),額外空間複雜度為o(1)的演算法,判斷這兩個鍊錶是否相交

分析:由於鍊錶相交,則必然最後會有公共部分,故可以直接判斷最後乙個節點是否相同。

若要找到第乙個交點,則需讓較長的鍊錶先走n2-n1步,然後兩鍊錶同步走,直到相交

**:

public

boolean

chkintersect(listnode heada, listnode headb)

問題:如何判斷兩個有環單鏈表是否相交?相交的話返回第乙個相交的節點,不想交的話返回空。如果兩個鍊錶長度分別為n和m,請做到時間複雜度o(n+m),額外空間複雜度o(1)。

分析:首先取得帶環鍊錶的環入口,如果兩入口相等,則有1,2兩種情況,否則有3,4兩種情況。

}綜合已上幾種情況,分為鍊錶都有環和都無環進行考慮,其他情況則不可能相交

鍊錶相關操作

include include using namespace std 鍊錶結構體 struct listnode 是否為空 bool isempty listnode list position是否是最後乙個 bool islast listnode position,listnode list ...

鍊錶相關操作

class listnode 1.鍊錶反轉,遍歷原鍊錶,採用頭插法將數值插入新鍊錶 public listnode reverse listnode p return cur 2.兩個鍊錶相加,如 1 2 3加4 5 6等於5 7 9。思路 短的鍊錶高位用0補。public class soluti...

鍊錶相關1

一 鍊錶的分化 題目 對於乙個鍊錶,我們需要用乙個特定閾值完成對它的分化,使得小於等於這個值的結點移到前面,大於該值的結點在後面,同時保證兩類結點內部的位置關係不變。給定乙個鍊錶的頭結點head,同時給定閾值val,請返回乙個鍊錶,使小於等於它的結點在前,大於等於它的在後,保證結點值不重複。思路 該...