一次過 Lintcode 223 回文鍊錶

2021-08-21 21:07:36 字數 1412 閱讀 1611

設計一種方式檢查乙個鍊錶是否為回文鍊錶。

1->2->1就是乙個回文鍊錶。

o(n)的時間和o(1)的額外空間。

鍊錶比字串難的地方就在於不能通過座標來直接訪問,而只能從頭開始遍歷到某個位置。那麼根據回文串的特點,我們需要比較對應位置的值是否相等,那麼我們首先需要找到鍊錶的中點,這個可以用快慢指標來實現,原理是fast和slow兩個指標,每次快指標走兩步,慢指標走一步,等快指標走完時,慢指標的位置就是中點。我們還需要用棧,每次慢指標走一步,都把值存入棧中,等到達中點時,鍊錶的前半段都存入棧中了,由於棧的後進先出的性質,就可以和後半段鍊錶按照回文對應的順序比較了。

需要注意考慮鍊錶數目為奇數與偶數的兩種情況,這兩種情況處理方法略有不同,具體見**:

/**

* definition of singly-linked-list:

* class listnode

* }*/class solution

//如果鍊錶數目為奇數,此時stk裝了中間元素,所以要剔除掉,維持其性質

if(fast->next == null)

stk.pop();

//棧中元素與鍊錶後半部分一位一位比較即可

while(slow->next != null)

return true;

}};

這道題的挑戰讓我們用o(1)的空間,那就是說我們不能使用stack了,那麼如果代替stack的作用呢,用stack的目的是為了利用其後進先出的特點,好倒著取出前半段的元素。那麼現在我們不用stack了,如何倒著取元素呢。我們可以在找到中點後,將後半段的鍊錶翻轉一下,翻轉部分鍊錶參見:lintcode 36. 翻轉鍊錶 ii。這樣我們就可以按照回文的順序比較了,**如下:

/**

* definition for listnode

* public class listnode

* }*/public class solution

//拆分鍊錶[head...slow]為前半部分,(slow, null)為後半部分

//node1指向前半部分的頭節點,node2指向後半部分的頭節點

listnode node2 = slow.next;

slow.next = null;

listnode node1 = head;

//對後半部分鍊錶翻轉

listnode pre = null;

listnode cur = node2;

while(cur != null)

//翻轉後pre為後半部分根節點

//依次比較節點值大小

while(pre != null && node1 != null)

return true;

}}

一次過 Lintcode 958 回文資料流

乙個資料流進來,每次乙個字母,當前資料流的排列是否能組成回文串。樣例 1 輸入 s a a a a a 輸出 1,1,1,1,1 解釋 a 的排列可以構成回文串 aa 的排列可以構成回文串 aaa 的排列可以構成回文串 aaaa 的排列可以構成回文串 aaaaa 的排列可以構成回文串樣例 2 輸入 ...

一次過 Lintcode 488 快樂數

寫乙個演算法來判斷乙個數是不是 快樂數 乙個數是不是快樂是這麼定義的 對於乙個正整數,每一次將該數替換為他每個位置上的數字的平方和,然後重複這個過程直到這個數變為1,或是無限迴圈但始終變不到1。如果可以變為1,那麼這個數就是快樂數。19 就是乙個快樂數。1 2 9 2 82 8 2 2 2 68 6...

一次過 Lintcode 496 玩具工廠

工廠模式是一種常見的設計模式。請實現乙個玩具工廠toyfactory用來產生不同的玩具類。可以假設只有貓和狗兩種玩具。toyfactory tf toyfactory toy toy tf.gettoy dog toy.talk wow toy tf.gettoy cat toy.talk meow...