剑指offer52:两个链表的第一个公共节点

题目描述:输入两个链表,找出它们的第一个公共节点。

图中的两个链表的第一个公共节点就是6。这道题可以使用栈,将两个链表的节点分别入栈,当所有节点都入栈后,从栈顶开始比较,找出第一个公共节点,但是这样需要辅助栈。因为链表假设有公共节点,而且是单链表,那么尾部的节点一定会交汇,如果能同时遍历到两个链表尾,那么要么没公共节点,各自到达链表尾,要么在某一结点出现公共节点。现在问题分解为怎么让两个链表同时遍历到尾节点,两个链表不知道谁长谁短,如果知道,长链表比短链表长多少,就让长链表先走多少步,然后两个一起走,就能同时到达尾部了。那么这个问题就细分为3步:1.求两个链表的长度 2.得到长度差,长链表先走长度差步 3.一起遍历两个链表。go代码实现:

 1 /**
 2  * Definition for singly-linked list.
 3  * type ListNode struct {
 4  *     Val int
 5  *     Next *ListNode
 6  * }
 7  */
 8 func getIntersectionNode(headA, headB *ListNode) *ListNode {
 9     //思路:先得到两个链表的长度,然后求出长度差diff,现在长链表上走长度diff步,然后两个链表一起遍历
10     //第一个相同的节点就是要找的公共节点  
11     length1 := getLinkLength(headA)
12     length2 := getLinkLength(headB) 
13     diff := length1 - length2
14     longHead := headA
15     shortHead := headB
16 
17     //看下到底是哪个链表要长一点
18     if length2 > length1 {
19         longHead = headB
20         shortHead = headA
21         diff = length2 - length1
22     }
23 
24     //长链表先走diff步
25     for diff > 0 {
26         diff--
27         longHead = longHead.Next
28     }
29 
30     //现在开始一起遍历,找公共节点
31     for longHead != nil && shortHead != nil && longHead != shortHead {
32         longHead = longHead.Next
33         shortHead = shortHead.Next
34     }
35 
36     return longHead
37 }
38 
39 func getLinkLength(head *ListNode) int {
40     var length int
41     var pNode *ListNode = head
42     for pNode != nil {
43         length++
44         pNode = pNode.Next
45     }
46 
47     return length
48 }

 

posted @ 2022-02-06 17:02  星星里的花  阅读(35)  评论(0)    收藏  举报