两个单向无环链表的第一个公共节点
输入两个链表,找出它们的第一个公共结点。
思路
- 解法一
快慢指针
图片转自剑指Offer(三十六):两个链表的第一个公共结点 | Jack Cui
如图所示,确定两个单向无环链表的公共节点,分为两部分。
首先,B先走,直到B的链表长度等于A的链表长度。
然后,A,B一起走,直到A,B相等,就是要找的第一个公共节点。 - 解法二
反转链表
需要注意的是,两个单向无环链表相交,说明这两个链表的尾节点一定相同。也可以可以考虑,两个链表分别遍历反向,从尾节点开始寻找公共节点。找到之后,需要再次反转链表。
代码
- 解法一
# -*- coding:utf-8 -*-
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
"""两个单向无环链表的相交"""
if pHead1 is None or pHead2 is None:
return None
cur1,cur2 = pHead1,pHead2
count = 0
while cur1.next is not None:
count += 1
cur1 = cur1.next
while cur2.next is not None:
count -= 1
cur2 = cur2.next
if cur1 != cur2:
return None
if count >= 0:
cur1,cur2 = pHead1,pHead2
else:
cur1,cur2 = pHead2,pHead1
while count != 0:
cur1 = cur1.next
count -= 1
while cur1 != cur2:
cur1,cur2 = cur1.next,cur2.next
return cur1
- 解法二
待补
两个单向有环链表的第一个公共节点
待补