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

  1 /*************************************************************************
  2     > File Name: 35_FirstCommonNode.cpp
  3     > Author: Juntaran
  4     > Mail: [email protected]
  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 }
时间: 2024-10-12 02:52:40

剑指Offer35 两个链表第一个公共结点的相关文章

剑指Offer - 两个链表第一个公共节点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 输入两个链表,找出它们的第一个公共结点. 代码: 注意:没有检测环状链表. /* struct ListNode { int

剑指Offer-35.两个链表的第一个公共结点(C++/Java)

题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { int d1 = 0; int d2 = 0; int d = 0; ListNode* p1 = pHead1; ListNode* p2 = pHead

两个链表第一个公共结点

题目:输入两个链表,找出它们的第一个公共节点.链表的定义如下: struct ListNode { int m_nValue; ListNode *m_pNext; }; 思路1:采用蛮力的方法:在第一个链表上顺序遍历每个节点,每遍历到一个节点的时候,在第二个链表上顺序遍历每个节点.如果第二个链表上的节点和第一个链表上的节点一样,就说明两个链表在节点上重合,于是就找到了公共的节点.而通常蛮力并不是好的方法. 思路2:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多

剑指offer--44.两个链表的第一个公共结点

@selfboot 牛逼的代码,长度相同,一遍出结果, 长度不同,短的点跑完,变成长的,当长的跑完变成短的链表的时候,较长的链表已经走过了多的结点. ------------------------------------------------------------------------------------------------------------------------ 时间限制:1秒 空间限制:32768K 热度指数:185905 本题知识点: 链表 题目描述 输入两个链表,

剑指offer——两个链表的公共节点

题目链接:输入两个链表,找出它们的第一个公共结点. 解题思路: 找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部) 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFir

剑指offer:删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5

1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,不必多说,return NULL: (2)如果恰恰是头结点与头结点的后一个重复了,这种情况是可以发生的,那头结点就要被删除,另选新的结点作为头结点.如何处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 1 /* 2 struct

剑指offer——20删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题解: 这道题没什么讲的,注意指向空的边界就行,新建一个头节点更容易处理. 1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) { 4 if (pHead == nullptr