① 找到两个链表的相交节点
示例:
输入: 8->3-> 2->1 6->5-> 4->3-> 2->1 输出: 3
- 此题先算出两个链表的长度,算出长度差,将长的链表定位到和短的一样的位置再进行比较。
/*
struct linkNode {
int val;
linkNode *next;
linkNode(int x) : val(x), next(NULL) {}
};
*/
linkNode *getIntersectionNode(linkNode *headA, linkNode *headB)
{
linkNode *p,*a,*b;
int lenA,lenB,k;
lenA=0;
lenB=0;
p=headA;
//先求出两个链表的长度
while(p!=nullptr){
p=p->next;
lenA++;
}
p=headB;
while(p!=nullptr){
p=p->next;
lenB++;
}
if(lenA>lenB){
k=lenA-lenB;
a=headA;
b=headB;
}
else{
k=lenB-lenA;
a=headB;
b=headA;
}
for(int i=1;i<=k;i++){
a=a->next;
}
while(a!=b){
a=a->next;
b=b->next;
}
return a;
}
② 给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
示例: