码迷,mamicode.com
首页 > 其他好文 > 详细

剑指Offer35 两个链表第一个公共结点

时间:2016-09-02 21:49:03      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

  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:\n");
 25     while (temp != NULL)
 26     {
 27         printf("%d ", temp->val);
 28         temp = temp->next;
 29     }
 30     printf("\n");
 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\n");
 80     else
 81         printf("Find %d\n", 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 }

 

剑指Offer35 两个链表第一个公共结点

标签:

原文地址:http://www.cnblogs.com/Juntaran/p/5835671.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!