剑指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 }

浙公网安备 33010602011771号