演算法題C (三)

2021-08-18 06:54:44 字數 2856 閱讀 7461

本部落格目錄

給定乙個單向鍊錶的頭節點head,節點的值型別是整型,再給定乙個整數p。實現乙個調整鍊錶的函式,將鍊錶調整為左部分都是值小於 p的節點,中間部分都是值等於p的節點,右部分都是值大於 p的節點。

空間複雜度為o(n)的演算法

//建立輔助陣列,先在陣列上排序,之後連線

//空間複雜度o(n)

listnode* listpartition1(listnode* head, int num)

int i = 0;

listnode* cur = head;

vectorarr;

while (cur != null)

arrpartition(arr, num);

for (i = 1; i != arr.size(); i++)

arr[i - 1]->next = null;

return arr[0];

}void arrpartition(vectorarr, int num)

else if (arr[cur]->val < num)

else }}

void (vectorarr, int i, int j)

空間複雜度為o(1)的演算法

//將鍊錶分成三個部分:

//分別為小於p、等於p、大於p

//分別用一串鍊錶連線起來,最終,連線成乙個鍊錶

listnode* listpartition2(listnode* head, int num)

else

} else if (head->val > num)

else

} else

else

} head = next;

} if (st != null)

if (et != null)

return sh != null ? sh : eh != null ? eh : bh;

}

listnode* copylistwithrand(listnode* head) 

listnode* cur = head;

while (cur != null)

cur = head;

while (cur != null)

cur = head;

listnode* clonehead = head->next;

while (cur->next != null)

return clonehead;

}

單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式, 如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null 即可。

/*

這個問題要考慮幾種情況:

1. 兩個鍊錶都是單鏈表,判斷入環節點

2. 兩個鍊錶都有環,判斷入環節點

3. 乙個鍊錶有環,乙個鍊錶無環,則一定不想交。因為它們都是單鏈表。

*/listnode* findfirst(listnode* head1, listnode* head2)

else if (loop1 != null && loop2 != null)

else

return firstnode;

}//判斷乙個鍊錶是否有環

//返回入環的節點

listnode* isloop(listnode* head)

listnode* slow = head->next;

listnode* fast = head->next->next;

while (slow != fast)

slow = slow->next;

fast = fast->next->next;

} fast = head;

while (slow != fast)

return slow;

}//都無環的情況

listnode* noloop(listnode* head1, listnode* head2)

int n = 0;

listnode* cur1 = head1;

listnode* cur2 = head2;

while (cur1->next != null)

while (cur2->next != null)

if (cur1 != cur2)

cur1 = n > 0 ? head1 : head2;

cur2 = cur1 == head1 ? head2 : head1;

n = abs(n);

while (n != 0)

while (cur1 != cur2)

return cur1;

}//都有環的情況

listnode* bothloop(listnode* head1, listnode* head2, listnode* loop1, listnode* loop2)

while (cur2 != loop2)

cur1 = n > 0 ? head1 : head2;

cur2 = cur1 == head1 ? head2 : head1;

n = abs(n);

while (n != 0)

while (cur1 != cur2)

return cur1;

} else

cur1 = cur1->next;

} return null;

}}

牛客網左程雲演算法課

日常演算法題(三)

1.對稱二叉樹 給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 想法 直接遞迴遍歷判斷是否相等即可 public boolean issymmetric treenode root p...

演算法題摘錄三

1 判斷給定陣列是不是二叉搜尋樹的前 後序遍歷序列 二叉搜尋樹的特點是 左子樹的值 根結點值 右子樹的值。而前 後序遍歷序列的首 尾數是根結點,依據根結點可以把陣列其餘部分劃分為左子樹 右子樹,然後根據左右子樹序列又可以遞迴地確定父結點並劃分子樹.如果能遞迴遍歷完整個陣列則說明合法,否則非法。下面是...

Leetcode演算法題 三

awk nr 10 file.txt nr表示行數 sed n 10p file.txt n表示只輸出匹配行,p表示print tail n 10 file.txt head n 1 從tail表示讀取之後的行,head表示之前的行 tail n 10 file.txt head 1題目總結 nr ...