写点什么

架构师训练营 -week08- 作业

用户头像
大刘
关注
发布于: 2020 年 11 月 13 日
架构师训练营 -week08-作业

作业:有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。

请用代码(或伪代码)描述算法,并给出时间复杂度。



采用双指针法:分别为链表 A 和链表 B 设置指针 A 和指针 B,然后开始遍历链表,如果遍历完当前链表,则将指针指向另外一个链表的头部继续遍历,直至两个指针相遇。

最终两个指针分别走过的路径为:

指针 A :a+c+b

指针 B :b+c+a

明显 a+c+b = b+c+a,因而如果两个链表相交,则指针 A 和指针 B 必定在相交结点相遇。


复杂度分析

  • 时间复杂度 : O(m+n)

  • 空间复杂度 : O(1)


代码如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {    //tempA和tempB我们可以认为是A,B两个指针    ListNode tempA = headA;    ListNode tempB = headB;    while (tempA != tempB) {        //如果指针tempA不为空,tempA就往后移一步。        //如果指针tempA为空,就让指针tempA指向headB(注意这里是headB不是tempB)        tempA = tempA == null ? headB : tempA.next;        //指针tempB同上        tempB = tempB == null ? headA : tempB.next;    }    //tempA要么是空,要么是两链表的交点    return tempA;    }}
复制代码


用户头像

大刘

关注

大道至简,知易行难 2017.12.27 加入

想成为合格架构师的架构师

评论

发布
暂无评论
架构师训练营 -week08-作业