兩個鏈表的第一個公共節點
題目描述
輸入兩個鏈表,找出它們的第一個公共結點。(注意因爲傳入數據是鏈表,所以錯誤測試數據的提示是用其他方式顯示的,保證傳入數據是正確的)
思路:連接兩個鏈表,使兩個指針遍歷的長度相等,遇到第一個相同的節點返回即可,還有另一種先求出較長的鏈表,再做遍歷其實原理一樣,屬同種解法。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
//雙指針解法
if(!pHead1 || !pHead2) return NULL;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while(p1 != p2)
{
//連接兩個鏈表,使兩個指針遍歷的長度相等,遇到第一個相同的節點返回
p1 = p1 == NULL ? pHead2:p1->next;
p2 = p2 == NULL ? pHead1:p2->next;
}
return p1;
}
};
數字在排序數組中出現的次數
題目描述
統計一個數字在排序數組中出現的次數。
思路:利用c++標準庫,二分查找,O(logn)複雜度。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//利用c++標準庫,二分查找,O(logn)複雜度。
//lower_bound(起始地址,結束地址,要查找的數值) 返回的是數值 第一個 出現的位置。
//upper_bound(起始地址,結束地址,要查找的數值) 返回的是數值 最後一個 出現的位置。
auto l = lower_bound(data.begin(), data.end(), k);
auto r = upper_bound(data.begin(), data.end(), k);
return r - l;
}
};