2019 10 15刷題小結

2021-09-28 16:26:12 字數 2268 閱讀 6018

三道劍指offer,一道leetcode,完成。

1.合併兩個排序鍊錶。

a:如果任何乙個鍊錶為空,那麼返回另乙個煉表頭結點即可。

b:申請兩個鍊錶節點變數,乙個用來當做返回的頭結點,乙個用來作為新鍊錶的遍歷。

c:最後別忘了把剩下的加到新鍊錶的最後。

listnode* merge(listnode* phead1, listnode* phead2)

else if(!phead2)

else

else

phead1=phead1->next;

}else

else

phead2=phead2->next;}}

if(phead1)

else if(phead2)

}return phead;

}

2.樹的子結構,判斷乙個二叉樹是不是另外乙個二叉樹的子結構,規定為空的二叉樹不是任何二叉樹的子結構。

需要兩個遞迴:1個是遍歷第乙個二叉樹的所有節點,判斷是不是有與第二個二叉樹根節點相同的節點(遞迴進行)

2是如果存在,則需要第二個遞迴判斷每個子節點是否都相等。

a:定義乙個布林變數,表示當前的判斷結果,初始化為false。

b:只有兩個二叉樹的根節點都不為空,才能繼續判斷,如果兩個根節點的值相等,可以進一步判斷其他的節點是否相等。(另外乙個遞迴)

c:如果是子結構,直接返回result,否則繼續遞迴左子樹和右子樹。

d:判斷是不是子結構,如果第二個節點為空,說明已經判斷完第二棵樹所有的節點,既然之前沒有觸發不等的條件,說明就是子結構,返回true。如果第乙個子樹的節點為空,但第二個不為空(如果為空走不到這一步,上一步就返回true了),那麼不可能是子結構,返回false。都不為空,但是數值不等,也返回false,否則(都不為空且相等),繼續判斷當前節點的左子節點和右子節點(遞迴)。

bool hassubtree(treenode* proot1, treenode* proot2)

if(!result)

if(!result)

}return result;

}bool dosehassubtree(treenode* proot1, treenode* proot2)

if(!proot1)

if(proot1->val!=proot2->val)

return dosehassubtree(proot1->left,proot2->left)&&dosehassubtree(proot1->right,proot2->right);

}

3.二叉樹的映象。

a:如果根節點為空,直接結束。

b:交換兩個左右節點,和交換兩個變數的數值是一樣的。

d:如果左子樹不為空,遞迴,右子樹不為空,遞迴。

void mirror(treenode *proot) 

else

if(proot->left)

if(proot->right)

}

4.鍊錶的插入排序。

a:如果頭結點或者頭結點的下乙個節點為空,直接返回頭結點即可。

b:一般陣列的插入排序都是已經排好的部分逆著和待插入元素比較,但是鍊錶是單向的,所以每次只能從排好的部分的頭結點開始比較。

c:申請四個變數:phead:排好序部分的頭結點,也是要返回的節點,tmpnode:用來遍歷排好序部分。pnode:待插入的元素,pnext:沒有排序部分的第乙個節點。

d:記得每次都將待排序的next指標賦值為nullptr.插入過程分四種情況,第一種:待插入元素比頭結點還小,那麼將待插入元素的next指向頭結點,然後更新頭結點。否則:分三種,一:待插入節點的值大於等於當前節點,且當前節點的下乙個節點為空,那麼將當前節點的next指標指向待插入節點,結束。二:如果當前節點的下乙個節點不為空,且待插入節點的值也大於等於下一節點的值,那麼向後遍歷下一節點;三:不為空,且待插入節點的值小於下一節點的值,把待插入節點插入兩個節點之間結束。

listnode *insertionsortlist(listnode *head) 

phead->next=nullptr;

while(pnext)

else if(pnode->val>=tmpnode->val)

else if(pnode->val>=tmpnode->next->val)

else}}

pnode=pnext;

}return phead;

}

2019 10 10刷題小結

今天的目標三道劍指offer,一道leetcode。完成 1.二維陣列查詢某個數是否存在,陣列是從左到右,從上到下依次增大的,可以從右上角和左下角開始查詢。以右上角為例。a 首先處理一下特殊情況,獲取一下二維陣列的行數,如果二維陣列為空直接返回false.b 再獲取列數。從右上角開始查詢的話則當前行...

2019 10 12刷題小結

三道劍指offer,一道leetcode,完成。1.斐波那契數列 num1 1 num2 1 next num2 num1 num1 num2 num2 next int fibonacci int n if n 1 n 2 int pre1 1 int pre2 1 int res 0 for i...

2019 10 18刷題小結

三道劍指offer一道leetcode。1.陣列中超過一半的數。申請兩個變數,乙個代表當前出現次數最多的數字,乙個代表相對出現的次數。分別初始化為陣列第乙個數和1.如果下乙個數和當前數相同,次數 否則次數 如果次數減為0,那麼就把當前數更新為此時遍歷的數,次數初始化為1.最後再遍歷一遍陣列此時儲存的...