链表公共节点

两个链表的第一个公共结点

http://www.nowcoder.com/questionTerminal/6ab1d9a29e88450685099d45c9e31e46

有意思,记录一下。

双指针,走到头之后从另一条的起点继续走,若公共节点存在,最终将在公共节点相遇。
以上思路不难想到。坑点在于,一开始用的是 当前结点.next 进行判空,提示复杂度超。
随手去掉 .next 后通过了,百思不得姐。看到题解评论恍然大悟,具体原因注在代码中。

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
    ListNode pA = pHead1, pB = pHead2;
    while(pA != pB){ 
//      此处直接用 pA 和 pB 判空,而非 .next 判空是为了避免死循环(两链表无公共节点)的情况:
//      使用 pA、pB 判空,若无公共节点,则最多走 a + b 步(若 a = b,则只需 a 步。a、b为两链表长度),
//      此时 pA = pB = null,即退出循环返回 null;否则陷入死循环。
        pA = pA == null ? pHead2 : pA.next;
        pB = pB == null ? pHead1 : pB.next;
    }
    return pA;
}
全部评论
不能用next判断的原因是因为如果一个为null的时候,我们是想让他在下一步中接到新链表,但此时会出现拿null.next异常
点赞 回复 分享
发布于 2021-06-29 22:30
我服了,题目信息给的也太少了。。。
点赞 回复 分享
发布于 2021-03-14 16:04

相关推荐

hwwhwh:同双非,有大厂实习其实也没啥用,主要看运气,等就行了
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务