题目描述
leetcode--LCR 023
注意:该题比较的是两个链表节点的地址是否相同,而不是通过值相同去判断
方法一:使用栈
两个链表分别为list1、list2
list1 = 1 - 2 - 3 - 4 - 5
list2 = 4 - 4 - 5
思路:
把两个链表的元素都压入栈中,然后同时出栈,等到最后一个出栈的相同元素就是第一个开始相交的节点
代码
public static ListNode getIntersectionNode3(ListNode headA, ListNode headB) {
Stack<ListNode> stackA = new Stack<>();
Stack<ListNode> stackB = new Stack<>();
//print(headA);
while(headA != null){
stackA.push(headA);
headA = headA.next;
}
while(headB != null){
stackB.push(headB);
headB = headB.next;
}
ListNode node = null;
//两个栈都不为空
while(stackA.size()>0 && stackB.size()>0){
//stackA.peek()返回栈顶元素,但不移除元素
//stackA.pop()获取栈顶元素,但移除元素
//在leetcode LCR 023题目中,要比较的是链表节点的地址相同,而不是值相同,所以不用值判断
if(stackA.peek() == stackB.peek()){
node = stackA.pop();
stackB.pop();
}else {
break;
}
}
/*if(node != null){
System.out.println(node.val);
}else{
System.out.println("null");
}*/
return node;
}
方法二:拼接两个链表
两个链表分别为list1、list2
list1 = 1 - 2 - 3 - 4 - 5
list2 = 4 - 4 - 5
思路:
把两个链表拼接成一个链表,如:
list1 = 1 - 2 - 3 - 4 - 5 - 4 - 4 - 5 ->null
list2 = 4 - 4 - 5 - 1 - 2 - 3 - 4 - 5 ->null
两个链表遍历后一定能找到相交的节点,若两个链表没有相交的节点,则链表遍历到最后都是null,就会直接返回null
代码:
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null && headB == null){
return null;
}
ListNode pa = headA;
ListNode pb = headB;
//判断是否到达公共节点
while(pa != pb){
pa = pa.next;
pb = pb.next;
//如果pa pb不存在交集,则会陷入死循环
//若没有交集,则最后会变成 pa = pb = null,天然地return null
if(pa != pb){
//虽然是两个拼接链表,但可以一个访问完后跳到另外一个链表访问
if(pa == null){
pa = headB;
}
if(pb == null){
pb = headA;
}
}
}
return pa;
}
方法三:可以使用差和双指针解决
两个链表分别为list1、list2
list1 = 1 - 2 - 3 - 4 - 5
list2 = 4 - 4 - 5
思路:
如list1的长度为5,list2的长度位3,5 - 3 = 2,则较长的链表先向前走两个节点,即list1的此时头节点先走到 3 处,此时list1 = 3 - 4 - 5,list2 = 4 - 4 - 5,list1 和 list2则可以同时向后遍历,找到相同的节点即是相交节点。
代码:
代码会比较繁琐