版权声明:允许转载,请注明文章出处 https://blog.csdn.net/Vickers_xiaowei/article/details/82919192
第一题
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL)return pHead2;
if(pHead2==NULL)return pHead1;
ListNode*head=NULL,*list1=pHead1,*list2=pHead2,*list=NULL;
if(list1->val<list2->val)//判断哪个链表的头结点作为新链表的头结点
{
head=list1;
list1=list1->next;
}
else
{
head=list2;
list2=list2->next;
}
list=head;//要记录下新链表头结点作为返回值,list用来遍历新链表
while(list1&&list2)
{
if(list1->val<list2->val)//取小的
{
list->next=list1;
list1=list1->next;
}
else
{
list->next=list2;
list2=list2->next;
}
list=list->next;//成功给新链表添加一个节点
}
if(list1)
{
list->next=list1;
}
if(list2)
{
list->next=list2;
}
return head;
}
};
第二题
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析可知需要左右树同时向下走,进行比较,而题设只给了一个头结点,所以可以巧妙地设计一个重载函数,两个函数构成递归。
设计的这个构造函数有两个参数,分别来走左右节点,如此可递归解决。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
return isSymmetrical(pRoot,pRoot);
}
bool isSymmetrical(TreeNode*root1,TreeNode*root2)
{
if(root1==NULL&&root2==NULL)
return true;
if(root1==NULL||root2==NULL)
return false;
if(root1->val!=root2->val)
return false;
return isSymmetrical(root1->left,root2->right)&&isSymmetrical(root1->right,root2->left);
}
};