先將其中乙個鍊錶的鏈頭按到另乙個鍊錶的尾部,如果他們有交集則會構成乙個環,題目等價於找鍊錶中的環的起始結點。找到後將鍊錶還原。
一.兩個長鍊表求交點(考慮環)
public listnode getintersectionnode(listnode heada, listnode headb)
listnode ta; // 用於記錄heada鍊錶的尾結點
listnode ha = heada;
// 第一步、找到heada的尾結點
while (ha.next != null)
ta = ha; // 記錄鍊錶heada的尾結點
// 第二步、將headb接到ta後面
ta.next = headb;
// 第三步、判斷是否存在環
// 判斷鍊錶是否存在環,辦法為:
// 設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,
// 如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。
// (當然,fast先行頭到尾部為null,則為無環鏈表)程式如下:
listnode fast = heada; // 每次前進一步
listnode slow = heada; // 每次前進二步
while (fast != null && fast.next != null)
}// 沒有環的情況
if (fast == null || fast.next == null)
// 有環的情況
// 找到環的入口點
// 當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。
// 假設slow走了s步,則fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:
//// 2s = s + nr
// s= nr
//// 設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。
// a + x = nr
// a + x = (n – 1)r +r = (n-1)r + l - a
// a = (n-1)r + (l – a – x)
//// (l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點,
// 於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。
slow = heada;
while (slow != fast)
ta.next = null;
return slow;}}
二。反轉單鏈表,反轉單鏈表的部分區間
ublic class listnode }1
2345
演算法實現類
public class solution
return root.next;}}
三。刪除原排序陣列內重複次數超過三次的數字(不開輔助空間)
public class solution
while (start < end)
}/**
* 題目一:輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字啊的順序不變。
* 為簡單起見,標點符號和普通字母一樣處理。
* * @param data
* @return
*/public static char reversesentence(char data)
reverse(data, 0, data.length - 1);
int start = 0;
int end = 0;
while (start < data.length) else if (end == data.length || data[end] == ' ') else
}return data;
六。尋找第乙個不重複的元素
public class firstnonrepeatedchar
// 遍歷map 找到第乙個值為1的就是找的結果
for (entryentry : map.entryset())
throw new runtimeexception("沒有找到相關的字元");
} public static char getfirstnorepeatchar2(string str)
// 在不重複地方集合裡包含了元素的時候刪除這個元素
if (norepeating.contains(letter)) else
} // 返回不重複的第乙個就可以了
return norepeating.get(0);
} public static char getfirstnorepeatchar3(string str) else
} // 遍歷集合找到值為一的就是要找的元素
for (int j = 0; j < str.length(); j++)
throw new runtimeexception("沒有找到");
}
七。將棧變佇列
大多數人的思路是:始終維護s1作為儲存空間,以s2作為臨時緩衝區。
入隊時,將元素壓入s1。
出隊時,將s1的元素逐個「倒入」(彈出並壓入)s2,將s2的頂元素彈出作為出隊元素,之後再將s2剩下的元素逐個「倒回」s1。
見下面示意圖:
幾道資料結構的演算法題
一問題 給定一組字串,要求求出乙個最短的字串使得它包含所有給出的字串。比如 a bc ca 輸出應該是 bca 2 按照陣列len的記錄長度,在剩下的字串中找出記錄長度最長的 字串,a.如果這個字串包含在string中,該字串已被包含,轉2 b.如果這個字串的長度是1,將該字串與string連線,該...
幾道java程式設計題
列印1 19個數中,所有和等於20的可能性 test public void calctwenty system.out.println 總共 total public void calctwenty string prefix,int count,int n else system.out.pri...
資料結構 程式設計題7 1
設計函式分別求兩個一元多項式的乘積與和。輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入乙個多項式非零項係數和指數 絕對值均為不超過1000的整數 數字間以空格分隔。輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。...