两个链表的第一个公共结点(递归解法,js)
两个链表的第一个公共结点
http://www.nowcoder.com/questionTerminal/6ab1d9a29e88450685099d45c9e31e46
首先判断:
1、当前两个节点是否为相等,相等这返回该节点以及节点的索引
2、链表是否已到链尾,是则返回空
然后:
let left = findFirst(p1.next,p2,k+1)
let right = findFirst(p1,p2.next,k+1)
left: 代表p1移到下一个节点,与p2比较
right: 代表p2移到下一个节点,与p1比较
进行以下判断
left和right是否都为空(代表向下找不到公共节点) 返回空
如果left、right都不为空,则比较两者k的大小,返回小的那个
如果一个为空一个不为空,则返回不为空的那个
这里的思路主要是,递归比较,如果有就返回这个节点+节点的索引值,找不到则返回null
找到两个则返回索引值小的那个,找到一个则直接返回结果。
/*function ListNode(x){ this.val = x; this.next = null; }*/ function FindFirstCommonNode(pHead1, pHead2) { // write code here let first = null first = findFirst(pHead1,pHead2,1) if(first == null) return null return first[0] } function findFirst(p1,p2,k){ if(p1 == p2){ return [p1,k]; } if(p1 == null || p2 == null) return null let left = findFirst(p1.next,p2,k+1) let right = findFirst(p1,p2.next,k+1) if(left == null && right == null) return null if(left !=null && right != null){ if(left[1]<right[1]){ return left }else{ return right } } if(left != null) return left if(right !=null) return right } module.exports = { FindFirstCommonNode : FindFirstCommonNode };