题目描述:
法一:双循环暴力法
思路:直接嵌套循环,找到相同的节点即返回,效率低
复杂度:时间复杂度O(n^2),空间复杂度O(1)
代码实现:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
let curA = headA;
while(curA){
let curB = headB
while(curB){
if(curA == curB) return curA;
curB = curB.next;
}
curA = curA.next;
}
return null;
};
法二:遍历标记法
思路:先对A链表遍历标记,然后遍历B链表,第一个有标记的就是相交节点
复杂度:时间复杂度O(n),空间复杂度O(n)
代码实现:
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
while (headA) {
headA.flag = true;
headA = headA.next;
}
while (headB) {
if (headB.flag) {
return headB;
}
headB = headB.next;
}
return null;
};
法三:链表拼接遍历法
思路:先将两个链表拼接在一起,A = A + B,B = B + A,拼接好后,两个链表长度则相同,此时,遍历后,相同位置上一定会有相交节点(相交链表都在尾部)
复杂度:时间复杂度O(n),空间复杂度O(1)
代码实现:
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
let pA = headA, pB = headB
while(pA || pB) {
if(pA === pB) return pA
pA = pA === null ? headB : pA.next
pB = pB === null ? headA : pB.next
}
return null;
};