//判断是否时same二叉树
class
Solution
{
public:
void
Preorder
(TreeNode
*
t, vector
<
char
>
v)
{
if
(t
==
NULL
)
v.
push_back
(
'#'
);
else
{
v.
push_back
(t->
val
+
'0'
);
Preorder
(t->
left
, v);
Preorder
(t->
right
, v);
}
}
bool
isSameTree
(TreeNode
*
p, TreeNode
*
q)
{
vector
<
char
>
v1;
vector
<
char
>
v2;
Preorder
(p, v1);
Preorder
(q, v2);
if
(v1.
size
()
!=
v2.
size
())
{
return
(
false
);
}
else
{
for
(
int
i
=
0
; i
<
v1.
size
(); i
++
)
{
if
(v1[i]
!=
v2[i])
{
return
(
false
);
}
}
}
return
(
true
);
}
};
bool
isSameTree
(TreeNode
*
p, TreeNode
*
q)
{
if
(p
==
NULL
&&
q
==
NULL
)
return
(
true
);
else
if
((p
==
NULL
&&
q
!=
NULL
)
||
(p
!=
NULL
&&
q
==
NULL
))
return
(
NULL
);
else
return
(p->
val
==
q->
val
&&
isSameTree
(p->
left
, q->
left
)
&&
isSameTree
(p->
right
, q->
right
));
}
//leetcode左节点叶子之和
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class
Solution
{
public:
int
dfs
(TreeNode
*&
root,
int
&
flag)
{
if
(root)
{
int
sum
=
0
;
if
(flag
==
1
&&
root->
left
==
NULL
&&
root->
right
==
NULL
)
sum
+=
root->
val
;
//左节点相加
sum
=
sum
+
dfs
(root->
left
,
1
)
+
dfs
(root->
right
,
0
);
return
(sum);
}
else
return
(
0
);
}
int
sumOfLeftLeaves
(TreeNode
*
root)
{
int
sum
=
0
;
dfs
(root,
0
);
return
(sum);
}
};
//remove the element
ListNode
*
removeElements
(ListNode
*
head,
int
val)
{
if
(head)
{
if
(head->
val
==
val)
//头节点
{
while
(head
&&
head->
val
==
val)
{
head
=
head->
next
;
}
}
if
(head)
{
ListNode
*
front
=
head;
//此处保证第一个节点并不是想要的
ListNode
*
cur
=
head->
next
;
while
(cur)
{
if
(cur->
val
==
val)
{
front->
next
=
cur->
next
;
cur
=
front->
next
;
}
else
{
cur
=
cur->
next
;
front
=
front->
next
;
}
}
return
(head);
}
else
return
(
NULL
);
}
else
return
(
NULL
);
}
//判断回文
//Could you do it in O(n) time and O(1) space?
class
Solution
{
public:
ListNode
*
reverse
(ListNode
*
head)
{
ListNode
*
p
=
head;
ListNode
*
temp
=
head->
next
;
ListNode
*
tail
=
NULL
;
while
(temp)
{
p->
next
=
tail;
tail
=
p;
//尾部指向P
p
=
temp;
temp
=
p->
next
;
}
p->
next
=
tail;
return
(p);
}
//判断是否是回文
bool
isPalindrome
(ListNode
*
head)
{
ListNode
*
p
=
head;
int
length
=
0
;
while
(p)
{
p
=
p->
next
;
length
++
;
}
ListNode
*
q
=
head;
int
i
=
0
;
while
(i
!=
(length
/
2
+
1
))
{
q
=
q->
next
;
i
++
;
}
ListNode
*
middle
=
reverse
(q);
//求出倒置的后半部分链表
ListNode
*
cur
=
head;
i
=
0
;
while
(i
<=
length
/
2
)
;
{
if
(middle->
val
!=
cur->
next
)
return
(
false
);
middle
=
middle->
next
;
cur
=
cur->
next
;
i
++
;
}
return
(
true
);
}
};
<!--
Intersection of Two Linked Lists
-->
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class
Solution
{
public:
ListNode
*
getIntersectionNode
(ListNode
*
headA, ListNode
*
headB)
{
if
(headA
&&
headB)
{
ListNode
*
pa
=
headA;
ListNode
*
pb
=
headB;
int
length_a
=
1
;
int
length_b
=
1
;
while
(pa->
next
)
{
length_a
++
;
pa
=
pa->
next
;
}
while
(pb->
next
)
{
length_b
++
;
pb
=
pb->
next
;
}
if
(pa
==
pb)
//若最后的节点是一样的则证明有交集
{
int
i
=
1
;
//找出最长的
if
(length_a
>=
length_b)
{
ListNode
*
cur
=
headA;
while
(i
<=
(length_a
-
length_b))
{
cur
=
cur->
next
;
i
++
;
}
//从长的链表开始
ListNode
*
qa
=
headA;
ListNode
*
qb
=
headB;
while
(qa
!=
qb)
{
qa
=
qa->
next
;
qb
=
qb->
next
;
}
return
(qa);
}
else
{
}
}
else
return
(
NULL
);
}
else
return
(
NULL
);
}
};
class
Solution
{
public:
ListNode
*
getIntersectionNode
(ListNode
*
headA, ListNode
*
headB)
{
if
(headA
&&
headB)
{
vector
<
ListNode
*>
Node;
Node.
push_back
(headA);
Node.
push_back
(headB);
vector
<
int
>
L;
//记录长度
L.
push_back
(
1
);
L.
push_back
(
1
);
ListNode
*
pa
=
headA;
ListNode
*
pb
=
headB;
//判断最后的节点是否一致
while
(pa->
next
)
{
L[
0
]
++
;
pa
=
pa->
next
;
}
while
(pb->
next
)
{
L[
1
]
++
;
pb
=
pb->
next
;
}
if
(pa
==
pb)
//如果最后的是相同节点则就是有交集
{
if
(leangth_a
>=
length_b)
{
index_long
=
0
;
index_short
=
1
;
}
else
{
index_long
=
1
;
index_short
=
0
;
}
int
i
=
1
;
//q节点是长的头结点
ListNode
*
cur
=
Node[index_long];
while
(i
<=
math.
abs
(length_a
-
length_b))
{
cur
=
cur->
next
;
i
++
;
}
//cur移动到|la-lb|的位置 此时cur q距离intersection的位置一样
ListNode
*
q
=
Node[index_short];
while
(q
!=
cur)
{
q
=
q->
next
;
cur
=
cur->
next
;
}
return
(q);
}
else
return
(
NULL
);
}
else
return
(
NULL
);
}
};
//Binary Tree Tilt
class
Solution
{
public:
//一个节点的和
int
SumInorder
(TreeNode
*
root)
{
if
(root)
return
(root->
val
+
SumInorder
(root->
left
)
+
SumInorder
(root->
right
));
else
return
(
0
);
}
//左右节点的差值
int
Deference
(TreeNode
*
root)
{
if
(root)
return
(
abs
(
SumInorder
(root->
left
)
-
SumInorder
(root->
right
)));
else
return
(
0
);
}
//找出
int
findTilt
(TreeNode
*
root)
{
if
(root)
return
(
Deference
(root)
+
findTilt
(root->
left
)
+
findTilt
(root->
right
));
else
return
(
0
);
}
};
//Linked List Components
class
Solution
{
public:
bool
isIn
(vector
<
int
>
&
G, ListNode
*
p)
//在就返回true
{
vector
<
int
>
::iterator it;
for
(it
=
G.
begin
(); it
!=
G.
end
(); it
++
)
{
if
((
*
it)
==
p->
val
)
return
(
true
);
}
return
(
false
);
}
int
numComponents
(ListNode
*
head, vector
<
int
>
&
G)
{
if
(head)
{
int
count
=
0
;
int
i
=
0
;
ListNode
*
p
=
head;
while
(p)
{
if
(
isIn
(G, p))
//发现相等
{
count
++
;
//发现相等加一
while
(p
&&
isIn
(G, p))
//如果在数组中
p
=
p->
next
;
}
if
(p)
p
=
p->
next
;
//向下移动
else
break
;
}
return
(count);
}
return
(
0
);
}
};
q
->
next
=
p
->
next;
p
->
next
=
q;
p
->
left
->
right
=
p;
p
->
l
->
r
=
p
->
r
p
->
r
->
l
=
p
->
l
//Swap Nodes in Pairs
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class
Solution
{
public:
ListNode
*
swapPairs
(ListNode
*
head)
{
ListNode
*
}
};
// Swap Nodes in Pairs
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class
Solution
{
public:
ListNode
*
swapPairs
(ListNode
*
head)
{
if
(head)
{
ListNode
*
p
=
head;
if
(p->
next
!=
NULL
)
{
int
temp;
while
(p->
next
!=
NULL
)
{
temp
=
p->
value
;
p->
value
=
p->
next
->
value
;
p->
next
->
value
=
temp;
p
=
p->
next
;
}
}
}
return
(
NULL
);
}
};