剑指 Offer 22. 链表中倒数第k个节点
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode*p=head,*q=head;
int count=0;
while(p->next!=NULL)
{
count++;
p=p->next;
}
int loc=count-k+1,c=0;
while(c<loc)
{
q=q->next;
c++;
}
return q;
}
};
剑指 Offer 24. 反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//头插法
if(head==NULL)
return head;
else if(head->next==NULL)
return head;
else
{
ListNode*p=head;
ListNode*q=p->next,*r=q->next;
p->next=NULL;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
return q;
}
}
};
剑指 Offer 25. 合并两个排序的链表
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *l3=new ListNode(0);
ListNode *r=l3;
while(l1!=NULL&&l2!=NULL)
{
if(l1->val<=l2->val)
{
r->next=l1;
l1=l1->next;
}
else{
r->next=l2;
l2=l2->next;
}
r=r->next;
}
if(l1!=NULL)
{
r->next=l1;
}
if(l2!=NULL)
{
r->next=l2;
}
return l3->next;
}
};
剑指 Offer 26. 树的子结构
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A==NULL||B==NULL) return false;
return isSubStructure(A->left,B)||isSubStructure(A->right,B)||dfs(A,B);
}
bool dfs(TreeNode*A,TreeNode*B)
{
if(B==NULL)
return true;
if(A==NULL||A->val!=B->val)
{
return false;
}
return dfs(A->left,B->left)&&dfs(A->right,B->right);
}
};
剑指 Offer 27. 二叉树的镜像
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(root==NULL)
return NULL;
TreeNode *tmp=root->left;
root->left=mirrorTree(root->right);
root->right=mirrorTree(tmp);
return root;
}
};