2. 两数相加
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry = 0;
ListNode* ans = new ListNode(0);
ListNode* p = l1, * q = l2;
ListNode* h = ans;
while(p != NULL || q != NULL){
if(p != NULL){
carry += p->val;
p = p->next;
}
if(q != NULL){
carry += q->val;
q = q->next;
}
h->next = new ListNode(carry % 10);
h = h->next;
carry /= 10;
}
if(carry > 0) {
h->next = new ListNode(carry);
}
return ans->next;
}
};
4. 寻找两个正序数组的中位数
class Solution {
private:
vector<int> nums1;
vector<int> nums2;
int m;
int n;
public:
int findMinOfKth(int k)
{
int i = 0;
int j = 0;
while (k >= 1)
{
if (i == m)
{
return nums2[j + k - 1];
}
else if (j == n)
{
return nums1[i + k - 1];
}
else if (k == 1)
{
return min(nums1[i], nums2[j]);
}
int t = k / 2 - 1;
int _i = min(i + t, m - 1);
int _j = min(j + t, n - 1);
if (nums1[_i] >= nums2[_j])
{
k -= _j - j + 1;
j = _j + 1;
}
else
{
k -= _i - i + 1;
i = _i + 1;
}
}
return 0;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
m = nums1.size();
n = nums2.size();
if (m == 0 && n == 0)
{
return 0.0;
}
this->nums1 = nums1;
this->nums2 = nums2;
int k = (m + n + 1) / 2;
if ((m + n) % 2 == 0)
{
return (findMinOfKth(k) + findMinOfKth(k + 1)) / 2.0;
}
else
{
return findMinOfKth(k);
}
}
};
5. 最长回文子串
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
vector< vector<int> > a(len, vector<int>(len));
int start(0), l(1);
for(int i = 0; i < len; i++)
{
a[i][i] = 1;
if(i + 1 < len && s[i] == s[i + 1])
{
a[i][i + 1] = 1;
start = i;
l = 2;
}
}
for(int r = 3; r <= len; r++)
{
for(int i = 0; i < len - r + 1; i++)
{
int j = i + r - 1;
if(s[i] == s[j] && a[i + 1][j - 1] == 1)
{
a[i][j] = 1;
start = i;
l = r;
}
}
}
return s.substr(start, l);
}
};