链表反转
注意三个问题:
1. 需要注意头节点的处理;
2. 需要注意尾节点的处理;
3. 需要链表不要断开。
void reverse(ListNode * head)
{
ListNode * newHead = NULL;
ListNode * node = head;
ListNode * preNode = NULL;
while( node != null)
{
ListNode * nextNode = node ->next;
if(nextNode == NULL)
{
newHead = node;
}
node ->next = preNode;
preNode = node;
node = nextNode;
}
return newHead;
}
两个链表的第一个公共节点
方法:
1.先计算出两个链表的长度num1、num2和它们的长度之差minus;
2.长的链表先走minus步;
3.两个链表同时向前走,第一个相等的节点即为两个链表的第一个公共节点。
ListNode * FindCommonNode(ListNode * head1, ListNode *head2)
{
if(head1 == NULL || head2 == NULL)
{
return NULL;
}
int len1 = ListLength(head1);
int len2 = ListLength(head2);
int max_list = len1;
int min_list = len2;
int minus_num = len1 - len2;
ListNode * max_node = head1;
ListNode * min_node = head2;
if(len1 < len2)
{
minus_num = len2 - len1;
max_list = len2;
min_list = len1;
max_node = head2;
min_node = head1;
}
while(minus > 0)
{
max_node = max_node->next;
minus--;
}
while(max_node != NULL && min_node != NULL)
{
if(max_node == min_node)
{
return max_node;
}
else
{
max_node++;
min_node++;
}
}
return NULL;
}
int ListLength(ListNode * head)
{
int len = 0;
ListNode * node = head;
while(node != NULL)
{
len++;
node = node->next;
}
return len;
}