[Leetcode] 160、相交链表 Intersection of Two Linked Lists
一、题目描述
题目链接
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表**:**
今天开始分块刷题嘞!
首先先刷刷链表吧!
最开始小白整了半天,愣是没看懂题目输入啥意思?
后来才发现,题目原来只输入俩链表?
最开始整了半天,暴力无果,遂看答案。
这道题最棘手的事儿就是两个链表长度不同,如果长度相同那就太好办了。
看了看答案发现还是精妙。
具体做法:
- 指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历
- 如果 pA 到了末尾,则 pA = headB 继续遍历
- 如果 pB 到了末尾,则 pB = headA 继续遍历
- 比较长的链表指针指向较短链表head时,长度差就消除了
- 如此,只需要将最短链表遍历两次即可找到位置
这视频挺有意思
贴代码
2、我的代码
/**
* 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) {
ListNode aHead = headA;
ListNode bHead = headB;
boolean aflag = true;
boolean bflag = true;
while(aHead!=null||bHead!=null){
if(aHead==null&&aflag){
aHead = new ListNode(-55);
aHead.next = headB;
aflag = false;
}
if(bHead==null&&bflag){
bHead = new ListNode(-56);
bHead.next = headA;
bflag = false;
}
if(aHead!=null&&bHead!=null&&aHead == bHead){
return aHead;
}
aHead = aHead.next;
bHead = bHead.next;
}
return null;
}
}
小白写的代码就是垃圾。。
3、大神的代码
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}