0
点赞
收藏
分享

微信扫一扫

【Kevin Learn 算法与数据结构】-->《剑指 offer》 两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
题目链接:​​​牛客网​​

解题思路

设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。

当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

public class Main {
public static class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}

@Override
public String toString() {
return val + "";
}
}

public static void main(String[] args) {
ListNode n1 = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
ListNode n5 = new ListNode(5);
ListNode n6 = new ListNode(6);
ListNode n7 = new ListNode(7);

n1.next = n2;
n2.next = n3;
n3.next = n6;
n6.next = n7;

n4.next = n5;
n5.next = n6;
System.out.println(findFirstCommonNode(n1,n4).toString());
}

public static ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode l1 = pHead1;
ListNode l2 = pHead2;

while (l1 != l2) {
l1 = (l1 == null) ? pHead2 : l1.next;
l2 = (l2 == null) ? pHead1 : l2.next;
}

return l1;
}
}

输出结果

【Kevin Learn 算法与数据结构】-->《剑指 offer》 两个链表的第一个公共结点_数据


举报

相关推荐

0 条评论