LeetCode解題思路筆記

做題,實(shí)際寫(xiě)出例子,然后分析可能遇到的情況,慢慢的,思路就會(huì)出來(lái)了。

線性表

33. Search in Rotated Sorted Array

這道題,不同于二分查找法在于,不能確定,中點(diǎn)一定是大于左端點(diǎn)的。所以,在進(jìn)行二分查找時(shí),需要多一步,即,先判斷中點(diǎn)是否大于左端點(diǎn)。
如果中點(diǎn)大于左端,再去比較三個(gè)點(diǎn),才可以按照二分邊界賦值。
如果中點(diǎn)小于左端,再去比較三個(gè)點(diǎn),再按照二分邊界賦值。

15. 3Sum

參考2SUM/3SUM/4SUM問(wèn)題
解決方法就是最外層遍歷一遍,等于選出一個(gè)數(shù),
之后的數(shù)組中轉(zhuǎn)化為找和為target-nums[i]的2SUM問(wèn)題。

16. 3Sum closest

參考 3Sum Closest 最近三數(shù)之和

所以我們需要定義一個(gè)變量diff用來(lái)記錄差的絕對(duì)值,然后我們還是要先將數(shù)組排個(gè)序,然后開(kāi)始遍歷數(shù)組,思路跟那道三數(shù)之和很相似,都是先確定一個(gè)數(shù),然后用兩個(gè)指針left和right來(lái)滑動(dòng)尋找另外兩個(gè)數(shù),每確定兩個(gè)數(shù),我們求出此三數(shù)之和,然后算和給定值的差的絕對(duì)值存在newDiff中,然后和diff比較并更新diff和結(jié)果closest即可,

31、next_permutation

參考[算法]——全排列(Permutation)以及next_permutation

其中,舉出例子,然后一點(diǎn)點(diǎn)的去試,然后根據(jù)試出的步驟,寫(xiě)代碼即可。
[6、5、4、8、7、5、1]

  • 1,1和5替換,沒(méi)有效果,那么1和7替換也沒(méi)有效果,再往前,比1大的都沒(méi)有效果。
  • 2,從上面也能看出,5替換的話,一直到8,也沒(méi)有效果。
  • 3,4替換8有效果,但是為了找到最小的下一個(gè)全排列,所以,應(yīng)該讓4和后面的8-5中,最小的替換。
  • 4、替換完事之后,發(fā)現(xiàn)變成了6558741,最后四位是降序的,不滿足條件。6551478才滿足條件,于是可以將后面的反轉(zhuǎn)。
  • 5、一開(kāi)始就是降序的話,那么直接反轉(zhuǎn)即可。

但是如果一個(gè)一個(gè)比較的話比較麻煩,可以看出,我們是從后面找起,找到不是降序的子數(shù)列為止。有一個(gè)方法,從后向前查找第一個(gè)相鄰元素對(duì)(i,j),并且滿足A[i] < A[j]。易知,此時(shí)從j到end必然是降序??梢杂梅醋C法證明。于是編程時(shí),可以用這個(gè),直接從第三步走起。

60、Permutation Sequence

參考 Permutation Sequence 序列排序

36、有效數(shù)獨(dú)

參考Valid Sudoku

48. Rotate Image

在原地修改,是可以利用tmp等變量來(lái)進(jìn)行修改的。

73. Set Matrix Zeroes

參考 Set Matrix Zeroes 矩陣賦零

  • 1、最原始的,是用O(m*n)的時(shí)間復(fù)雜度,再建立一個(gè)新的矩陣,一個(gè)數(shù)一個(gè)數(shù)的讀,一行一行的掃進(jìn)去,遇到0 ,就把新的矩陣改行設(shè)置為0 。再一列一列的掃
  • 2、將時(shí)間降到O(m+n),可以用兩個(gè)數(shù)組,一個(gè)m維數(shù)組記錄哪一行有0 ,一個(gè)n維數(shù)組記錄哪一列有0。(in方法判斷)最后更新
  • 3、但是要求空間復(fù)雜度為O(1),不能用額外的空間。所以想到,用第一行,第一列存儲(chǔ)。
  • 4、但是,第一行第一列的數(shù)值也要保證不能變(除非改行有0)。按照下面的邏輯。

主要是更新順序

  • 先掃描第一行第一列,如果有0,則將各自的flag設(shè)置為true(最后再更新。)
  • 然后掃描除去第一行第一列的整個(gè)數(shù)組,如果有0,則將對(duì)應(yīng)的第一行和第一列的數(shù)字賦0
  • 再次遍歷除去第一行第一列的整個(gè)數(shù)組,如果對(duì)應(yīng)的第一行和第一列的數(shù)字有一個(gè)為0,則將當(dāng)前值賦0
  • 最后根據(jù)第一行第一列的flag來(lái)更新第一行第一列

136. Single Number

參考Single Number

每次一個(gè)元素進(jìn)行異或,0和5異或返回5.....

86. Partition List

單鏈表

61. Rotate List

  • k是可以大于n的,所以需要對(duì)n取余數(shù)
  • 倒著往回?cái)?shù),快慢指針,快的先走k步,然后慢的再走

字符串

125、有效回文

一般情況下做法:建立兩個(gè)指針,左右相比較

對(duì)于不是字母的字符串,用list[l].isalnum()來(lái)判斷真假,while循環(huán)跳過(guò)去就行

特殊情況,字符串是[]空。

幾乎所有的題,都要考慮這個(gè)情況,對(duì)于字符串是空,對(duì)于鏈表一類(lèi)的可能只有一個(gè)node??傊?,考慮極端情況是對(duì)的。

5. Longest Palindromic Substring

參考 Longest palindromic substring 最長(zhǎng)回文子串

20、有效括號(hào)

問(wèn)題的思路分析,即能夠通過(guò)在字符間插入特定數(shù)目的豎線,使得整個(gè)字符串各個(gè)局部都對(duì)稱(chēng)。由這句話,局部對(duì)稱(chēng)來(lái)引入棧,

考慮到棧中可以通過(guò)一進(jìn)一出,兩進(jìn)兩出的類(lèi)似對(duì)稱(chēng)。所以,可以用棧來(lái)解決此問(wèn)題。

代碼思路:
step1:初始化棧,并入棧輸入串的第一個(gè)字符;
step2: 從輸入串的第二個(gè)字符到最后一個(gè)字符,依次與棧頂元素對(duì)比,棧不為空且棧頂元素與字符匹配則出棧,否則入棧該字符;
Step3: 操作完最后一個(gè)字符后,如果棧為空(即有進(jìn)必有出,各個(gè)局部均對(duì)稱(chēng)),則輸入合法;

參考valid parentheses

另外,可以用list的append和pop方法來(lái)近似的構(gòu)造出一個(gè)棧的數(shù)據(jù)結(jié)構(gòu)。

若出現(xiàn)右邊的括號(hào)類(lèi)型,那么為了valid,上一個(gè)壓入棧中的一定是這個(gè)括號(hào)的左邊類(lèi)型。
即,如果出現(xiàn)了“)”,那么棧最上面的一定是“(”才行??梢杂纱诉M(jìn)行判斷。

32、最大有效括號(hào)的長(zhǎng)度longest parenthses

此算法, 用“(”的索引來(lái)進(jìn)行壓棧,入棧操作。是因?yàn)椋枰?jì)算合法括號(hào)字符的長(zhǎng)度,用數(shù)字運(yùn)算比較方便。

這個(gè)和有效括號(hào)有些不同,這個(gè)

  • 1、原則1,就是,棧中只會(huì)存放左邊括號(hào)的符號(hào)“(”位置索引。這是利用了括號(hào)有效的必要條件的特性,下面會(huì)把這些情況都解釋一下。
  • 2、這里的棧存放的不再是“(”,而是此符號(hào)的位置索引了。(當(dāng)然也可以用兩個(gè)棧,一個(gè)存放“(”,一個(gè)存放位置索引。沒(méi)必要而已。)

接下來(lái)是代碼思路:
參考longest parenthses

每次來(lái)了‘(’之后,無(wú)條件壓棧。

用“)”進(jìn)行消除,有這幾種情況需要考慮。
首先就是“))()”這樣的,即,碰到頭兩個(gè)右括號(hào)時(shí),棧為空,那么一定不是合法的了,可以跳過(guò)。

然后就是“((())()”,此時(shí)碰到了第一個(gè)“)”時(shí),消掉最上面的左括號(hào),然后接下來(lái)是第二個(gè)“)”,可以再次消掉棧最上面的左括號(hào),然后碰到“(” ,直接入棧,然后繼續(xù)碰到“)”,再次消掉。

直到“)”用完為止或者棧為空為止。下面依次解釋這兩種情況。

  • 1、“)”用完了。棧內(nèi)還有剩余的‘(’。如上例:
    此時(shí)棧里還剩一個(gè)“(”沒(méi)有消掉,而“)”已經(jīng)沒(méi)有了。那么此時(shí)這個(gè)有效括號(hào)的長(zhǎng)度就是當(dāng)前“)”的索引減去棧頂“(”的索引值。對(duì)應(yīng)到例子上就是,6-0=6。
    然后再與前面已有的合法長(zhǎng)度進(jìn)行比較。maxLength = Math.max(i - (int)stack.peek() , maxLength)

  • 2、')'沒(méi)用完,??樟?br> 此時(shí)需要引入一個(gè)新的變量start,用于表示新的合法括號(hào)字符串的起點(diǎn)。
    例如:對(duì)于這種情況:())()(),可以正確的得出最大值為4。
    start初始為-1,之后每次碰到‘)’且棧為空的時(shí)候更新為當(dāng)前‘)’的index。
    比如上例中, start就為第二個(gè)“)”的index,表示新的合法字符串起點(diǎn)為3.

  • 3、一直循環(huán)就是了。

此算法, 用“(”的索引來(lái)進(jìn)行壓棧,入棧操作。是因?yàn)?,需要?jì)算合法括號(hào)字符的長(zhǎng)度,用數(shù)字運(yùn)算比較方便。

樹(shù)

144、二叉樹(shù)前序遍歷

注意,樹(shù)中的node并不是一個(gè)int類(lèi)型的數(shù)字。這個(gè)node具有屬性的。分別是node.val,node.left 和 node.right。分別代表著這個(gè)node的值,左子節(jié)點(diǎn)和右子節(jié)點(diǎn)。

所以,壓入棧中的,也是node,而不是node.val。

此題要求不能用遞歸的方法前序遍歷二叉樹(shù)。
想到前序遍歷的路徑,一直讀入最左邊的葉節(jié)點(diǎn),然后退回父節(jié)點(diǎn)接著讀父節(jié)點(diǎn)的右子節(jié)點(diǎn)(注意此時(shí)父節(jié)點(diǎn)已經(jīng)被讀取過(guò)了),和棧有些相似。于是想到用棧來(lái)解決問(wèn)題。
(最好畫(huà)個(gè)圖,來(lái)分析循環(huán)的步驟。)
題中已經(jīng)給出,節(jié)點(diǎn)具有的三個(gè)屬性。

root作為根節(jié)點(diǎn)
令棧為空

  • 1、讀入節(jié)點(diǎn)1,如果1有左子節(jié)點(diǎn),就繼續(xù)遍歷入棧,一直入棧到底(此時(shí),棧里壓入一個(gè)元素,list就append一個(gè)元素。)
  • 2、彈棧,彈出一個(gè)元素,就檢測(cè)該元素是否有右子節(jié)點(diǎn)。即root.right是否為空。若不為空,就遍歷壓入棧中。
    1. 彈出5,沒(méi)有左右子節(jié)點(diǎn),繼續(xù)彈棧,1彈出后,有右子節(jié)點(diǎn),于是按照上面步驟壓入棧中。
  • 4、一直循環(huán)到,節(jié)點(diǎn)為空,棧為空為止。
        list_num= []
        stack = []
        while root or stack:
            if root:
                list_num.appent(root)
                stack.append(root)
                root = root.left
            else:
                stack.pop()
                root = root.right
        return list_num

逐層返回二叉樹(shù)

參考# Binary Tree Level Order Traversal 二叉樹(shù)層序遍歷

層序遍歷二叉樹(shù)是典型的廣度優(yōu)先搜索BFS的應(yīng)用,但是這里稍微復(fù)雜一點(diǎn)的是,我們要把各個(gè)層的數(shù)分開(kāi),存到一個(gè)二維向量里面,大體思路還是基本相同的,建立一個(gè)queue,然后先把根節(jié)點(diǎn)放進(jìn)去,這時(shí)候找根節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn),這時(shí)候去掉根節(jié)點(diǎn),此時(shí)queue里的元素就是下一層的所有節(jié)點(diǎn),用一個(gè)for循環(huán)遍歷它們,然后存到一個(gè)一維向量里,遍歷完之后再把這個(gè)一維向量存到二維向量里,以此類(lèi)推,可以完成層序遍歷。代碼如下:

第二版本:

形,不同之處在于一行是從左到右遍歷,下一行是從右往左遍歷,交叉往返的之字形的層序遍歷。根據(jù)其特點(diǎn)我們用到棧的后進(jìn)先出的特點(diǎn),這道題我們維護(hù)兩個(gè)棧,相鄰兩行分別存到兩個(gè)棧中,進(jìn)棧的順序也不相同,一個(gè)棧是先進(jìn)左子結(jié)點(diǎn)然后右子節(jié)點(diǎn),另一個(gè)棧是先進(jìn)右子節(jié)點(diǎn)然后左子結(jié)點(diǎn),這樣出棧的順序就是我們想要的之字形了,代碼如下:

101 對(duì)稱(chēng)樹(shù)

  class Solution:
    # @param root, a tree node
    # @return a boolean
    def isSymmetric(self, root):
        # a new recursive function to check if two tree are symetric
        def isMirror(root1,root2):
                # they all could be Null to be symetric
            if not root1 and not root2:
                return True
                # if they are not Null, they must carry the same value
            elif (root1 and root2) and root1.val==root2.val:
                # recursively call itself
                return isMirror(root1.left,root2.right) and isMirror(root1.right, root2.left)
            else:
                return False
        if not root:
            return True
        return isMirror(root.left, root.right)

114. Flatten Binary Tree to Linked List

參考 Flatten Binary Tree to Linked List 將二叉樹(shù)展開(kāi)成鏈表

這道題要求把二叉樹(shù)展開(kāi)成鏈表,根據(jù)展開(kāi)后形成的鏈表的順序分析出是使用先序遍歷,那么只要是數(shù)的遍歷就有遞歸和非遞歸的兩種方法來(lái)求解,這里我們也用兩種方法來(lái)求解。首先來(lái)看遞歸版本的,思路是先利用DFS的思路找到最左子節(jié)點(diǎn),然后回到其父節(jié)點(diǎn),把其父節(jié)點(diǎn)和右子節(jié)點(diǎn)斷開(kāi),將原左子結(jié)點(diǎn)連上父節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再把原右子節(jié)點(diǎn)連到新右子節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再回到上一父節(jié)點(diǎn)做相同操作。代碼如下:

112 path sum

遞歸:1 終止條件 2 每次都要變化的

  • 首先,如果輸入的是一個(gè)空節(jié)點(diǎn),則直接返回false,如果如果輸入的只有一個(gè)根節(jié)點(diǎn),則比較當(dāng)前根節(jié)點(diǎn)的值和參數(shù)sum值是否相同,若相同,返回true,否則false。 這個(gè)條件也是遞歸的終止條件。
  • 下面我們就要開(kāi)始遞歸了,由于函數(shù)的返回值是Ture/False,我們可以同時(shí)兩個(gè)方向一起遞歸,中間用或||連接,只要有一個(gè)是True,整個(gè)結(jié)果就是True。
  • 遞歸左右節(jié)點(diǎn)時(shí),這時(shí)候的sum值應(yīng)該是原sum值減去當(dāng)前節(jié)點(diǎn)的值。代碼如下:

129. Sum Root to Leaf Numbers

···
class Solution {
public:
int sumNumbers(TreeNode *root) {
return sumNumbersDFS(root, 0);
}
int sumNumbersDFS(TreeNode *root, int sum) {
if (!root) return 0;
sum = sum * 10 + root->val;
if (!root->left && !root->right) return sum;
return sumNumbersDFS(root->left, sum) + sumNumbersDFS(root->right, sum);
}
};
···

105、利用前序遍歷和中序遍歷構(gòu)建二叉樹(shù)

參考idiot-maker
實(shí)際上,就是利用這兩個(gè)遍歷的特性,確定遍歷的邊界。

要解決這道題目,就要分別利用preorder和inorder遍歷的兩個(gè)性質(zhì)。preoder的第一個(gè)元素確定為根節(jié)點(diǎn),然后再在inorder里,它左側(cè)的就是左子樹(shù)的全部節(jié)點(diǎn),右側(cè)的就是右子樹(shù)的全部節(jié)點(diǎn)。然后再對(duì)左子樹(shù)這些節(jié)點(diǎn),遞歸調(diào)用上面的方法。

比如

  • preorder,7是根節(jié)點(diǎn)
  • inorder,7左邊的是左子樹(shù)全部節(jié)點(diǎn),長(zhǎng)度為4,7右邊的是右子樹(shù)全部節(jié)點(diǎn),長(zhǎng)度為3.
  • preorder,7后邊4個(gè)數(shù),全是左子樹(shù)的val。第5個(gè)數(shù)開(kāi)始,全是右子樹(shù)的val??捎纱舜_定,左子樹(shù)的根節(jié)點(diǎn)是10,右子樹(shù)的根節(jié)點(diǎn)是2
  • inorder,左子樹(shù)的根節(jié)點(diǎn)10,左邊的都是左子樹(shù)的左子樹(shù)長(zhǎng)度為1,右邊的都是左子樹(shù)的右子樹(shù)長(zhǎng)度為2。
  • preorder,10后邊1個(gè)數(shù),全是左子樹(shù)的val。第2個(gè)數(shù)開(kāi)始,全是右子樹(shù)的val??捎纱舜_定,左子樹(shù)的根節(jié)點(diǎn)是4,右子樹(shù)的根節(jié)點(diǎn)是3.

就這樣遞歸下去。

對(duì)應(yīng)成代碼,就是

def buildTree(self, preorder, inorder):
        if not preorder or not inorder:#遞歸的終止條件,當(dāng)此樹(shù)的遍歷列表為空時(shí),說(shuō)明為葉節(jié)點(diǎn)。
            return None

        rootValue = preorder[0]#確定根節(jié)點(diǎn)的值
        root = TreeNode(rootValue)#用TreeNode構(gòu)造根節(jié)點(diǎn)
        inorderIndex = inorder.index(rootValue)#確定根節(jié)點(diǎn)在中序遍歷中的index
        
        #root的左子樹(shù)的長(zhǎng)度,就是根節(jié)點(diǎn)在inorder中左邊的部分的長(zhǎng)度,
        #那么可以知道,樹(shù)的左子樹(shù)的前序遍歷就是preorder列表中[1:inorderIndex+1]的部分
        #左子樹(shù)的中序遍歷就是inorder中的[:inorderIndex]部分。
        root.left = buildTree(preorder[1:inorderIndex+1], inorder[:inorderIndex])

        root.right = buildTree(preorder[inorderIndex+1:], inorder[inorderIndex+1:])
        
        return root

98、Validate Binary Search Tree驗(yàn)證二分查找樹(shù)是有效的

參考Validate Binary Search Tree
用遞歸的話,時(shí)間復(fù)雜度是O(n2)。

需要注意的是,左子樹(shù)的所有節(jié)點(diǎn)都要比根節(jié)點(diǎn)小,而非只是其左孩子比其小,右子樹(shù)同樣。這是很容易出錯(cuò)的一點(diǎn)是,很多人往往只考慮了每個(gè)根節(jié)點(diǎn)比其左孩子大比其右孩子小。如下面非二分查找樹(shù),如果只比較節(jié)點(diǎn)和其左右孩子的關(guān)系大小,它是滿足的。

通過(guò)這個(gè)思路進(jìn)行判斷。
二分查找樹(shù)的中序遍歷結(jié)果是一個(gè)遞增序列。
所以,可以先對(duì)二分查找樹(shù)進(jìn)行中序遍歷(遞歸),再判斷此序列是不是一個(gè)遞增序列。

108、 Convert Sorted Array to Binary Search Tree

參考 Convert Sorted Array to Binary Search Tree

  • 1、二叉搜索樹(shù)的特性:始終滿足左<根<右

  • 2、一個(gè)二叉搜索樹(shù)的中序遍歷就是一個(gè)遞增序列。

于是,反過(guò)來(lái),我們可以認(rèn)為,根節(jié)點(diǎn)就是有序列表的中間點(diǎn),從中間點(diǎn)分開(kāi)為左右兩個(gè)有序數(shù)組,在分別找出其中間點(diǎn)作為原中間點(diǎn)的左右兩個(gè)子節(jié)點(diǎn)。遞歸進(jìn)行下去就行。(這也是二分查找法的核心思想)

代碼也與二分查找的代碼類(lèi)似。遞歸

111、Minimum Depth of Binary Tree

參考 Minimum Depth of Binary Tree

也是遞歸,關(guān)于minipath長(zhǎng)度怎么疊加,
可以采用,在遞歸函數(shù)中,當(dāng)當(dāng)前節(jié)點(diǎn)是葉節(jié)點(diǎn)時(shí),返回0.
如果當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn),那么就返回min(left_path(),right_path()) +1。即當(dāng)前子節(jié)點(diǎn)下面路徑的最小值再加1。

那么得到的效果就是,從上往下,每次下沉,都會(huì)加1。一直加到 最終葉節(jié)點(diǎn),得到 minipath為0。然后再一次返回到根節(jié)點(diǎn),得到路徑長(zhǎng)度。

對(duì)參考的程序的解讀。

  • 1、如果左右子節(jié)點(diǎn)都為空,那么就返回1。(因?yàn)榇藭r(shí)只有一層節(jié)點(diǎn),路徑也只能是1)

  • 2、如果,左子節(jié)點(diǎn)為空,那么就返回右子節(jié)點(diǎn)的遞歸+1。
    左子節(jié)點(diǎn)為空,說(shuō)明右子節(jié)點(diǎn)不為空。要是畫(huà)出圖來(lái),那么此路徑就會(huì)經(jīng)過(guò)父節(jié)點(diǎn)必須向右子節(jié)點(diǎn)過(guò)去。此時(shí)的路徑長(zhǎng)度就是返回右子節(jié)點(diǎn)的遞歸調(diào)用加1了。
    注意!并不是說(shuō),左子節(jié)點(diǎn)為空,那么父節(jié)點(diǎn)就不往下走了,最短路徑就已經(jīng)求得了,而是說(shuō),左子節(jié)點(diǎn)為空,那么父節(jié)點(diǎn),也得往下走,一直走到葉節(jié)點(diǎn)為止。

  • 3、如果,右子節(jié)點(diǎn)為空,那么就返回左子節(jié)點(diǎn)的遞歸+1。

  • 4、如果是其余情況(都不為空),就返回左右子節(jié)點(diǎn) 二者遞歸調(diào)用的最小值。

排序

88. Merge Sorted Array

參考LeetCode_Merge Sorted Array

這里需要注意的是,num1和nums2都是數(shù)組,每次從nums2中挑出一個(gè)元素插入nums1中,都是需要改變數(shù)組的index的。

如果單純得考慮從小到大地將兩個(gè)數(shù)組進(jìn)行合并的話,每次在num1中插入一個(gè)數(shù)的話,需要將后面的元素都向后移動(dòng)一位,這樣,整個(gè)處理過(guò)程的時(shí)間復(fù)雜度為O(m*n)。

題目已經(jīng)給出,nums1可以認(rèn)為長(zhǎng)度是m+n。那么就可以先把nums2中的最大值和nums中的最大值進(jìn)行比較,放到nums1中的最后一位(index=m+n-1)。
然后比較得到次最大值,將次最大值放在m+n-2位置,依次類(lèi)推,這樣在將元素放置到合適位置的時(shí)候,就不需要移動(dòng)元素,這個(gè)方法的時(shí)間復(fù)雜度為O(m+n)。

每次循環(huán)中,如果nums2的元素被插入到了最大值中,那么n=n-1。下次可以用nums2[n-1]來(lái)對(duì)nums2中的次最大值進(jìn)行索引。

21. Merge Two Sorted Lists

參考Merge Two Sorted Lists

鏈表有序合并也是數(shù)據(jù)結(jié)構(gòu)里邊的經(jīng)典題目了。

  • 1、分別掃描兩個(gè)鏈表,比較兩個(gè)節(jié)點(diǎn)的大小值,把較小的節(jié)點(diǎn)值尾插到結(jié)果鏈表屁股后邊,
  • 2、然后再次掃描兩個(gè)鏈表,直到其中某一個(gè)鏈表或者兩條鏈表同時(shí)結(jié)束。
  • 3、如果是某條鏈表提前結(jié)束則應(yīng)將另一條鏈表的其余節(jié)點(diǎn)都接到結(jié)果鏈表上。

75、sort colors

  • 定義red指針指向開(kāi)頭位置,blue指針指向末尾位置

  • 從頭開(kāi)始遍歷原數(shù)組,如果遇到0,則交換該值和red指針指向的值,并將red指針后移一位。若遇到2,則交換該值和blue指針指向的值,并將blue指針前移一位。若遇到1,則繼續(xù)遍歷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容