問題描述:
現有兩個公升序鍊錶,且鍊錶中均無重複元素。請設計乙個高效的演算法,列印兩個鍊錶的公共值部分。
給定兩個鍊錶的頭指標heada和headb,請返回乙個vector,元素為兩個鍊錶的公共部分。請保證返回陣列的公升序。兩個鍊錶的元素個數均小於等於500。保證一定有公共 值測試樣例:
,
返回:[2.4.6]方法:兩個頭指標分別指向表頭,哪個結點元素小,哪個指標前移,如果相同,則都前移,任意乙個鍊錶走完,函式停止。
public問題:有乙個單鏈表,請設計乙個演算法,使得每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不調整,因為只有兩個節點不夠一組。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;
}
給定乙個單鏈表的頭指標head,同時給定k值,返回逆序後的鍊錶的頭指標。
方法:利用棧的特性,對k個元素進行反轉
public listnode inverse(listnode head, int方法1:t=o(n),s=o(n), 利用棧把鍊錶每個元素入棧,然後依次出棧和鍊錶元素對比。k) }
else
}if(top==k-1)
else
lastgrouphead.next=null
;
return
newhead.next;
}
方法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問題:現在有兩個無環單鏈表,若兩個鍊錶的長度分別為m和n,請設計乙個時間複雜度為o(n + m),額外空間複雜度為o(1)的演算法,判斷這兩個鍊錶是否相交int chkloop(listnode head, int
adjust)
return
fast.val;}}
return -1;
}
分析:由於鍊錶相交,則必然最後會有公共部分,故可以直接判斷最後乙個節點是否相同。
若要找到第乙個交點,則需讓較長的鍊錶先走n2-n1步,然後兩鍊錶同步走,直到相交
**:
public問題:如何判斷兩個有環單鏈表是否相交?相交的話返回第乙個相交的節點,不想交的話返回空。如果兩個鍊錶長度分別為n和m,請做到時間複雜度o(n+m),額外空間複雜度o(1)。boolean
chkintersect(listnode heada, listnode headb)
分析:首先取得帶環鍊錶的環入口,如果兩入口相等,則有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,請返回乙個鍊錶,使小於等於它的結點在前,大於等於它的在後,保證結點值不重複。思路 該...