【刷题-剑指 Offer】 52. 两个链表的第一个公共节点

题目

 输入两个链表,找出它们的第一个公共节点。

 

 

 

 


 

设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有

  • a + c + b = b + c + a
  • 若无交集,则a + b = b + a
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
         ListNode h1 = headA, h2 = headB;
        while (h1 != h2) {

            h1 = h1 == null ? headB : h1.next;
            h2 = h2 == null ? headA : h2.next;
        }

        return h1; 
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
### 回答1: 可以使用链表来实现。链表是一种由节点组成的数据结构,每个节点包含一个数据域和一个向下一个节点针。在这个问题中,可以创建两个链表,分别表示7和52两个数字,然后将它们依次相连形成一个新的链表,即可得到一个序列。具体实现可参考以下代码: class Node: def __init__(self, val): self.val = val self.next = None def create_linked_list(arr): head = Node(arr[0]) tail = head for i in range(1, len(arr)): node = Node(arr[i]) tail.next = node tail = node return head def merge_linked_list(head1, head2): if not head1: return head2 if not head2: return head1 if head1.val <= head2.val: head1.next = merge_linked_list(head1.next, head2) return head1 else: head2.next = merge_linked_list(head1, head2.next) return head2 def print_linked_list(head): while head: print(head.val, end=' ') head = head.next arr1 = [7, 8, 9] arr2 = [5, 2] head1 = create_linked_list(arr1) head2 = create_linked_list(arr2) head = merge_linked_list(head1, head2) print_linked_list(head) # 输出结果为:2 5 7 8 9 ### 回答2: 题目描述: 给定两个升序链表 A 和 B,输出它们的交集。例如,链表 A,B 分别为: A = {1, 3, 4, 5, 7},B = {2, 3, 5, 6, 9},输出的交集为 {3, 5}。 解题思路: 这道题目非常适合使用双针的解法,我们可以将针分别链表 A 和链表 B 的头结点,然后开始比较这两个节点的大小,如果两个值相等,那么这个值就是两个链表的交集中的一个元素,将其记录下来,并分别向后移动针 A 和针 B,继续比较下一个节点的值,而如果节点的值不相等,那么就将值较小的针向后移动一位,因为链表已经是升序排列的,如果值较小的针向后移动一位,那么下一个元素的值不可能比值较大的针的当前元素的值更小。 代码实现: ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) { if (headA == nullptr || headB == nullptr) { return nullptr; } ListNode* p1 = headA; ListNode* p2 = headB; ListNode* res = new ListNode(0); ListNode* cur = res; while (p1 != nullptr && p2 != nullptr) { if (p1->val == p2->val) { cur->next = new ListNode(p1->val); cur = cur->next; p1 = p1->next; p2 = p2->next; } else if (p1->val < p2->val) { p1 = p1->next; } else { p2 = p2->next; } } return res->next; } 总结: 本题运用了双针的思路,即用针分别链表 A 和链表 B 的头结点,根据节点的大小关系来判断针应该向哪里移动。因为链表是升序排列的,所以每次移动针都可以排除一些不可能成为交集元素的节点,时间复杂度为 O(m + n),其中 m 表示链表 A 的长度,n 表示链表 B 的长度。 ### 回答3: 题目描述: 给定两个按非递减顺序排序的链表序列,求它们的交集。例如链表1:1→2→3→3→4→5→6,链表2:3→3→5→7,它们的交集为3→3→5。 分析: 由于两个链表都是按照非递减顺序排列的,因此可以利用双针的方法,同时遍历两个链表。具体步骤如下: 1.初始化链表1和链表2的针,分别为p1和p2。 2.遍历两个链表,当p1和p2向的节点值相等时,将这个值加入结果链表中,并将p1和p2都向后移动一位;否则,将p1和p2中值较小的那个针向后移动一位。 3.重复执行步骤2,直到一个链表遍历完毕,或者结果链表已经包含了所有的交集元素。 4.返回结果链表。 代码实现: ```python class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: dummy = ListNode(0) p = dummy p1, p2 = headA, headB while p1 and p2: if p1.val == p2.val: p.next = ListNode(p1.val) p = p.next p1 = p1.next p2 = p2.next elif p1.val < p2.val: p1 = p1.next else: p2 = p2.next return dummy.next ``` 总结: 本题使用了双针的思想,时间复杂度为O(m+n),其中m和n分别为两个链表的长度。需要注意的一点是,由于链表中可能存在重复元素,因此需要在结果链表中保留这些重复的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值