【LeetCode 简单题】35-相交链表

声明:

今天是第35道题。编写一个程序,找到两个单链表相交的起始节点。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

题目:编写一个程序,找到两个单链表相交的起始节点。

例如,下面的两个链表

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在节点 c1 开始相交。

注意:

  • 如果两个链表没有交点,返回 null
  • 在返回结果后,两个链表仍须保持原有的结构
  • 可假定整个链表结构中没有循环
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存、

解法1。若两个链表不等长,较长的链表遍历完毕后(假设p1指向较长的链表),p1重新指向headB,此时p2指向的元素就和p1指向的元素对齐了,想象一下,此时两链表右对齐。在此之后的遍历就能顺利找到相交节点,代码如下。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        # V 1.0,能提交
        p1 = headA
        p2 = headB
        while(p1 != p2):
            p1 = headB if p1 is None else p1.next
            p2 = headA if p2 is None else p2.next
        return p1

解法2。 方法2更好理解一点,就是先把两个链表右对齐(不过这样相当于假设相交节点在后面,如果在前面就gg了??),但下面的代码没有考虑这点,也能执行成功

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """        
        # V 2.0,能提交
        # 计算两个链表的长度cnt_A、cnt_B
        p1 = headA
        p2 = headB
        cnt_A = 0
        cnt_B = 0
        while p1 is not None:
            p1 = p1.next
            cnt_A += 1
        while p2 is not None:
            p2 = p2.next
            cnt_B += 1
        
        # p1,p2要重新赋值,因为上述计算长度时两者已指向None了   
        p1 = headA
        p2 = headB    
        if cnt_A > cnt_B:
            diff = cnt_A - cnt_B    # 让长度更长的链表和更短的链表(右)对齐
            while diff>0:
                p1 = p1.next
                diff -= 1
        else:
            diff = cnt_B - cnt_A
            while diff>0:
                p2 = p2.next
                diff -= 1
        while p1 != p2:
            p1 = p1.next
            p2 = p2.next
        return p1

 

结尾

解法1:https://blog.csdn.net/weixin_40449300/article/details/81211806

解法2:https://blog.csdn.net/qq_34364995/article/details/80518198

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值