编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
思路:把两个链表左边对齐,然后同时遍历,第一个相同的结点就是解。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
int get_list_len(ListNode * head)//计算长度
{
int len = 0;
while(head)
{
len++;
head = head->next;
}
return len;
}
ListNode *foward_long_list(int long_list,int short_list,ListNode * head)//两条链表左对齐
{
int subtract = long_list - short_list;
while(head && subtract)
{
head = head->next;
subtract--;
}
return head;
}
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int list_A_len = get_list_len(headA);
int list_B_len = get_list_len(headB);
if(list_A_len>list_B_len)
{
headA = foward_long_list(list_A_len,list_B_len,headA);
}
else
{
headB = foward_long_list(list_B_len,list_A_len,headB);
}
while(headA && headA)
{
if(headA == headB)
return headA;
headA = headA->next;
headB = headB->next;
}
return NULL;
}
};