1 /************************************************************************* 2 > File Name: 35_FirstCommonNode.cpp 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年09月02日 星期五 20时52分28秒 6 ************************************************************************/ 7 8 #include <stdio.h> 9 #include <malloc.h> 10 11 // 链表结构体 12 struct ListNode 13 { 14 int val; 15 struct ListNode* next; 16 }; 17 18 // 顺序输出链表 19 void PrintList(ListNode* head) 20 { 21 if (head == NULL) 22 return; 23 ListNode* temp = head; 24 printf("PrintList: "); 25 while (temp != NULL) 26 { 27 printf("%d ", temp->val); 28 temp = temp->next; 29 } 30 printf(" "); 31 } 32 33 // 获取链表长度 34 int getListLength(ListNode* head) 35 { 36 int length = 0; 37 ListNode* p = head; 38 while (p) 39 { 40 length ++; 41 p = p->next; 42 } 43 return length; 44 } 45 46 // 寻找第一个公共结点 47 ListNode* FindFirstCommonNode(ListNode* head1, ListNode* head2) 48 { 49 int length1 = getListLength(head1); 50 int length2 = getListLength(head2); 51 52 ListNode* longList; 53 ListNode* shortList; 54 int diff; 55 56 if (length1 >= length2) 57 { 58 longList = head1; 59 shortList = head2; 60 diff = length1 - length2; 61 } 62 else 63 { 64 longList = head2; 65 shortList = head1; 66 diff = length2 - length1; 67 } 68 69 for (int i = 0; i < diff; ++i) 70 longList = longList->next; 71 72 while (longList && shortList && shortList!=longList) 73 { 74 longList = longList->next; 75 shortList = shortList->next; 76 } 77 78 if (longList == NULL) 79 printf("Not Find "); 80 else 81 printf("Find %d ", longList->val); 82 83 return longList; 84 } 85 86 int main() 87 { 88 // 测试链表结构 89 ListNode* head1 = (ListNode*)malloc(sizeof(ListNode)); 90 head1->val = 1; 91 ListNode* p1 = head1; 92 for (int i = 0; i < 4; ++i) 93 { 94 ListNode* q1 = (ListNode*)malloc(sizeof(ListNode)); 95 q1->val = i + 2; 96 p1->next = q1; 97 p1 = q1; 98 } 99 p1->next = NULL; 100 101 102 ListNode* head2 = (ListNode*)malloc(sizeof(ListNode)); 103 head2->val = 6; 104 ListNode* p2 = head2; 105 for (int i = 0; i < 4; ++i) 106 { 107 ListNode* q2 = (ListNode*)malloc(sizeof(ListNode)); 108 q2->val = i + 7; 109 p2->next = q2; 110 p2 = q2; 111 } 112 p2->next = NULL; 113 114 p1->next = head2->next->next; 115 116 PrintList(head1); 117 PrintList(head2); 118 119 FindFirstCommonNode(head1, head2); 120 }