**
Leetcode-两数相加
**
题目描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
令对应位置的数相加,注意进位问题,通过对10取余存储个位,再有两数之和大于999的情况要再进位。
代码如下
/**
* 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) {
ListNode* k=new ListNode(-1);//用于存储结果
ListNode* p=k;
bool q=false;//判定是否进位
while(l1!=NULL||l2!=NULL)
{
int sum=0;
if(l1!=NULL)
{
sum+=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
sum+=l2->val;
l2=l2->next;
}
if(q)
sum++;
p->next=new ListNode(sum%10);
p=p->next;
if(sum>9)
q=true;
else
q=false;
}
if(q)
p->next=new ListNode(1);
return k->next;
}
};
**
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
ans = ListNode() #创建一个节点作为头节点,值为None
p = ans #p为遍历用的节点,由于python的性质,修改p也会修改ans
sum = 0 #sum计算l1和l2两个节点的和,用sum来求取余的值和进位值
while l1 or l2:
sum += (l1.val if l1 else 0) + (l2.val if l2 else 0) #如果l1或l2节点为None,加数就作为0
p.next = ListNode(sum % 10)
sum = sum // 10
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
p = p.next
if sum == 1: #如果sum进位值最后为1,在尾节点再加1
p.next = ListNode(1)
return ans.next
寻找两个有序数组的中位数
**
**
问题描述
**
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码如下
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int m=nums2.size();//获取数组的长度
int Lmax1, Lmax2, Rmin1, Rmin2, c1, c2, imin=0, imax=2*n;/*Lmax1,Rmin1之间为数组1割点,c1用于确定数组1割点,由c1可得出c2进而得到数组2割点,
假想数组为2n+1的长度,imax为下标所以是2n*/
while(imin<=imax)
{
c1=(imin+imax)/2;
c2=n+m-c1;
Lmax1=(c1==0)? INT_MIN: nums1[(c1-1)/2];
Rmin1=(c1==2*n)?INT_MAX: nums1[c1/2];
Lmax2=(c2==0)? INT_MIN: nums2[(c2-1)/2];
Rmin2=(c2==2*m)?INT_MAX: nums2[c2/2];
if(Lmax1>Rmin2)
imax=c1-1;
else if(Lmax2>Rmin1)
imin=c1+1;
else
break;
}
int Lmax=(Lmax1>Lmax2)?Lmax1:Lmax2;
int Rmin=(Rmin1<Rmin2)?Rmin1:Rmin2;
return (Lmax+Rmin)/2.0;
}
};
**
Leetcode-最长回文子串
**
题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
中心扩散法获取最大回文子串
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==0||len==1)
return s;
int start=0;//记录回文子串起始位置
int end=0;//记录回文子串终止位置
int mlen=0;//记录最大回文子串的长度
for(int i=0;i<len;i++)
{
int len1=expendaroundcenter(s,i,i);//一个元素为中心
int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
mlen=max(max(len1,len2),mlen);
if(mlen>end-start+1)
{
start=i-(mlen-1)/2;
end=i+mlen/2;
}
}
return s.substr(start,mlen);
//该函数的意思是获取从start开始长度为mlen长度的字符串
}
private:
int expendaroundcenter(string s,int left,int right)
//计算以left和right为中心的回文串长度
{
int L=left;
int R=right;
while(L>=0 && R<s.length() && s[R]==s[L])
{
L--;
R++;
}
return R-L-1;
}
};