【leetcode】02.07. 链表相交
链表相交
- 题目
- 代码
- 1. 计算两个链表的长度
- 2. 双指针
题目
02.07. 链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
代码
1. 计算两个链表的长度
思路: 获取两个链表的长度,然后根据将两个链表的开始节点从同一长度(相对于后面相等)开始
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""# 计算两个链表的长度,然后从后面的相同长度开始lenA = 0lenB = 0cur = headAwhile cur:cur = cur.nextlenA += 1cur = headBwhile cur:cur = cur.nextlenB += 1curA = headAcurB = headB# 让长链表的指针先走 |lenA - lenB| 步if lenA > lenB:for i in range(lenA - lenB):curA = curA.nextelse:for i in range(lenB - lenA):curB = curB.nextwhile curA:if curA == curB:return curAcurA = curA.nextcurB = curB.nextreturn None
2. 双指针
思路: 根据快慢法则,走的快的一定会追上走得慢的。
在这道题里,有的链表短,他走完了就去走另一条链表,我们可以理解为走的快的指针。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""# 双指针ta, tb = headA, headBwhile ta != tb:ta = ta.next if ta else headBtb = tb.next if tb else headAreturn tb
代码随想录:链接