2个链表的第一个公共结点

来源:互联网 发布:贾森威廉姆斯生涯数据 编辑:程序博客网 时间:2024/06/04 18:19

题目:输入2个链表,找出他们的第一个公共结点。

链表定义如下

struct ListNode{    int value;    ListNode * next;};

何为公共结点?若2个链表有公共结点,则2个链表从某一结点开始,他们的next都指向同一个结点,由于是单向链表的结点,每个结点只有一个next指针,故从第一个公共结点开始,之后的结点都是重合的,不会再出现分支。

根据之后结点重合的特点可以首先遍历每个链表得到他们的长度,然后让长度长的链表先走两者的差值,这样2个链表之后的长度就会一样;接着再同时在2个链表上遍历,找到的第一个相同结点就是他们的第一个公共结点。

int ListLength(ListNode* head){//获得链表的长度int length = 0;ListNode* node = head;while (node!=NULL){length++;node = node->next;}return length;}//得到第一个共同结点ListNode* FirstCommonNode(ListNode* head1,ListNode* head2){if (head1 == NULL || head2 == NULL)return NULL;ListNode* commenNode = NULL;int length1 = ListLength(head1);int length2 = ListLength(head2);ListNode* longList = NULL;ListNode* shortList = NULL;int longlength = 0;int shortlength = 0;if (length1 >= length2){longList = head1;longlength = length1;shortList = head2;shortlength = length2;}else{longList = head2;longlength = length2;shortList = head1;shortlength = length1;}int sub = longlength - shortlength;//2个链表的差值for (int i = 0; i < sub; i++)//长链表先走差值步数,再同时在2个链表上遍历longList = longList->next;while (longList!=NULL&&shortList!=NULL){if (longList == shortList){commenNode = longList;break;}longList = longList->next;shortList = shortList->next;}return commenNode;}


0 0
原创粉丝点击