鍊錶LeetCode習題練習2

2021-09-25 09:43:53 字數 3746 閱讀 7120

編寫**,以給定值x為基準將鍊錶分割成兩部分,所有小於x的結點排在大於或等於x的結點之前

給定乙個鍊錶的頭指標 listnode*phead,請返回重新排列後的鍊錶的頭指標。注意:分割以後保持原來的資料順序不變

​ 解題思路:建立兩個新鍊錶,分別儲存小於給定值和大於指定值的節點。最後將兩個鍊錶連線起來就可以了。需要注意將兩個鍊錶的頭結點儲存下來。

public

class

partition

else

cur=cur.next;

} cur1.next=head2.next;

return head1.next;

}}

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

解題思路:可以考慮採用遞迴的方法實現,當遇到重複節點的時候,就往下走,當遇到不重複的節點,將第乙個不同的節點作為頭節點遞迴。

public

class

solution

if(phead.val==phead.next.val)

return

deleteduplication

(cur);}

else

return phead;

}}

對於乙個鍊錶,請設計乙個時間複雜度為o(n),額外空間複雜度為o(1)的演算法,判斷其是否為回文結構。

給定乙個鍊錶的頭指標a,請返回乙個bool值,代表其是否為回文結構。保證鍊錶長度小於等於900。

測試樣例:

1->2->2->1

返回:true

解題思路:找到鍊錶的中點,反轉鍊錶的後半段,然後分別從兩端往中間走,如果遇見了,則是回文,若沒相遇,或者值不相等,則不是回文。這裡需要注意鍊錶為單數還是複數,如果為複數,則前乙個值的下乙個節點與後乙個節點相遇就是回文。

public

class

palindromelist

if(a.next==null)

listnode head=a;

listnode fast=a;

listnode slow=a;

while

(fast!=null&&fast.next!=null)

listnode cur=slow;

while

(cur!=null)

while

(slow!=head)

if(head.next==slow)

slow=slow.next;

head=head.next;

}return

true;}

}

編寫乙個程式,找到兩個單鏈表相交的起始節點。

如下面的兩個鍊錶:

在節點 c1 開始相交。

示例 1:

輸入:intersectval = 8, lista = [4,1,8,4,5], listb = [5,0,1,8,4,5], skipa = 2, skipb = 3

輸出:reference of the node with value = 8

輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [4,1,8,4,5],鍊錶 b 為 [5,0,1,8,4,5]。在 a 中,相交節點前有 2 個節點;在 b 中,相交節點前有 3 個節點。

示例 2:

輸入:intersectval = 2, lista = [0,9,1,2,4], listb = [3,2,4], skipa = 3, skipb = 1

輸出:reference of the node with value = 2

輸入解釋:相交節點的值為 2 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [0,9,1,2,4],鍊錶 b 為 [3,2,4]。在 a 中,相交節點前有 3 個節點;在 b 中,相交節點前有 1 個節點。

示例 3:

輸入:intersectval = 0, lista = [2,6,4], listb = [1,5], skipa = 3, skipb = 2

輸出:null

輸入解釋:從各自的表頭開始算起,鍊錶 a 為 [2,6,4],鍊錶 b 為 [1,5]。由於這兩個鍊錶不相交,所以 intersectval 必須為 0,而 skipa 和 skipb 可以是任意值。

解釋:這兩個鍊錶不相交,因此返回 null。

注意:如果兩個鍊錶沒有交點,返回 null.

在返回結果後,兩個鍊錶仍須保持原有的結構。

可假定整個鍊錶結構中沒有迴圈。

程式盡量滿足 o(n) 時間複雜度,且僅用 o(1) 記憶體。

解題思路:如果兩個鍊錶有交點,則其相交之後的部分為同一鍊錶,所以相交後的長度是相同的,則只需要從相同長度的位置開始檢測,如果有相同節點,則有相交。

public

class

solution

listnode cur1=heada;

listnode cur2=headb;

int lena=0;

int lenb=0;

while

(cur1!=null)

while

(cur2!=null)

cur1=heada;

cur2=headb;

int mylen=lena-lenb;

if(mylen<0)

for(

int i=

0;i)while

(cur1!=null&&cur2!=null)

cur1=cur1.next;

cur2=cur2.next;

}return null;

}}

給定乙個鍊錶,判斷鍊錶中是否有環。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

解題思路:定義兩個標記點,乙個走兩步,乙個走一步,如果相遇則有環,沒相遇則沒環。

public

class

solution

}return

false;}

}

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

說明:不允許修改給定的鍊錶。

解題思路:首先還是判斷是否有環,定義fast和slow 乙個走兩步,乙個走一步,若相遇則有環,否則沒環。在相遇的地點將fast放在頭結點處,和slow同時走,由於第一次fast走了slow的兩倍,再讓slow和fast走相同步數,此時slow相當於第一次走的fast,fast相當於slow。第二次相遇就在入環的第乙個節點。

public

class

solution}if

(fast==null||fast.next==null)

fast=head;

while

(fast!=slow)

return slow;

}}

鍊錶練習題

鍊錶 這裡我記錄了鍊錶的各種操作的演算法,在後面的習題中會涉及到這些演算法的思路。leetcode206.反轉鍊錶 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null反序的演算法之前記錄過,可以就地反序,也可以使用棧反序,這裡為了節省時間和空間,就用就地反序...

LeetCode習題 反轉鍊錶

輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解題思路 遍歷鍊錶的同時,prev指標保持指向反轉後鍊錶的頭節點,pcur指標沿著鍊錶移動,移動的同時,將pcur當前指向的節點插入到prev之前,prev重新指向最新頭結點,pcur繼續移動,直到鍊錶尾部結束 definitio...

鍊錶練習題1

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...