1.两个链表,求第一个公共结点
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* p1=pHead1;
ListNode* p2=pHead2;
int len1=0,len2=0,tmp=0;
if((pHead1==NULL) || (pHead2==NULL))
return NULL;
while(p1!=NULL){
p1=p1->next;
len1++;
}
while(p2!=NULL){
p2=p2->next;
len2++;
}
p1=pHead1;
p2=pHead2;
if(len1 > len2){
tmp=len1-len2;
while(tmp--){
p1=p1->next;
}
}
else{
tmp=len2-len1;
while(tmp--){
p2=p2->next;
}
}
while(p1!=NULL){
if(p1==p2)
return p1;
p1=p1->next;
p2=p2->next;
}
return NULL;
}
};
2.把一个搜索二叉树改为双向链表
思路:
搜索二叉树中序遍历由小到大
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
TreeNode* Head=NULL; //头指针
TreeNode* tmp=NULL;//遍历树时指针
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
Convert(pRootOfTree->left);
if(Head==NULL){
Head=pRootOfTree;
tmp=pRootOfTree;
}
else{
tmp->right=pRootOfTree;
pRootOfTree->left=tmp;
tmp=pRootOfTree;
}
Convert(pRootOfTree->right);
return Head;
}
};