- 1、题目描述:
-3、 设计思想:
详细操作流程看下图:
-4、视频讲解链接B站视频讲解
-5、代码:
c++版本:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1 == nullptr || pHead2 == nullptr){ //特判为空的情况 return nullptr; } ListNode*cur1 = pHead1; ListNode*cur2 = pHead2; int n = 0;//用来保存两个链表长度差 //找到链表最后一个元素,并且沿途更新n,用来判断链表谁长 while(cur1->next){ n ++; cur1 = cur1->next; } while(cur2->next){ n --; cur2 = cur2->next; } //上面结束后n的含义代表两个链表的长度差 if(cur1 != cur2){ //如果最后一个元素都不相等,那么肯定没有公共节点 return nullptr; } cur1 = n > 0 ? pHead1 : pHead2;//谁长谁就变成cur1 cur2 = cur1 == pHead1 ? pHead2:pHead1;//谁短谁就是cur2 n = abs(n);//如果为n<0需要变成正数 while(n){ //使cur1移动到和cur2长度一样的位置处 n--; cur1 = cur1->next; } //此时,链表长度都是从同一长度出发,能够找到第一个公共节点 while(cur1!=cur2){ cur1 = cur1->next; cur2 = cur2->next; } return cur1; } };
Java版本:
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead1 == null || pHead2 == null){ //特判为空的情况 return null; } ListNode cur1 = pHead1; ListNode cur2 = pHead2; int n = 0;//用来保存两个链表长度差 //找到链表最后一个元素,并且沿途更新n,用来判断链表谁长 while(cur1.next!= null){ n ++; cur1 = cur1.next; } while(cur2.next!= null){ n --; cur2 = cur2.next; } //上面结束后n的含义代表两个链表的长度差 if(cur1 != cur2){ //如果最后一个元素都不相等,那么肯定没有公共节点 return null; } cur1 = n > 0? pHead1 : pHead2;//谁长谁就变成cur1 cur2 = cur1 == pHead1 ? pHead2:pHead1;//谁短谁就是cur2 n = Math.abs(n);//如果为n<0需要变成正数 while(n > 0){ //使cur1移动到和cur2长度一样的位置处 n--; cur1 = cur1.next; } //此时,链表长度都是从同一长度出发,能够找到第一个公共节点 while(cur1!=cur2){ cur1 = cur1.next; cur2 = cur2.next; } return cur1; } }
Python版本:
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # # @param pHead1 ListNode类 # @param pHead2 ListNode类 # @return ListNode类 # class Solution: def FindFirstCommonNode(self , pHead1 , pHead2 ): # write code here if pHead1==None or pHead2 == None: #特判为空的情况 return None cur1,cur2=pHead1,pHead2 n = 0#用来保存两个链表长度差 #找到链表最后一个元素,并且沿途更新n,用来判断链表谁长 while cur1.next: n += 1 cur1 = cur1.next while cur2.next: n -= 1 cur2 = cur2.next #上面结束后n的含义代表两个链表的长度差 if cur1 != cur2: #如果最后一个元素都不相等,那么肯定没有公共节点 return None cur1 = pHead1 if n > 0 else pHead2#谁长谁就变成cur1 cur2 = pHead2 if cur1 == pHead1 else pHead1;#谁短谁就是cur2 n = abs(n)#如果为n<0需要变成正数 while n: #使cur1移动到和cur2长度一样的位置处 n -= 1 cur1 = cur1.next #此时,链表长度都是从同一长度出发,能够找到第一个公共节点 while cur1!=cur2: cur1 = cur1.next cur2 = cur2.next return cur1
JavaScript版本:
/*function ListNode(x){ this.val = x; this.next = null; }*/ function FindFirstCommonNode(pHead1, pHead2) { // write code here if(pHead1 == null || pHead2 == null){ //特判为空的情况 return null; } let cur1 = pHead1; let cur2 = pHead2; let n = 0;//用来保存两个链表长度差 //找到链表最后一个元素,并且沿途更新n,用来判断链表谁长 while(cur1.next!= null){ n ++; cur1 = cur1.next; } while(cur2.next!= null){ n --; cur2 = cur2.next; } //上面结束后n的含义代表两个链表的长度差 if(cur1 != cur2){ //如果最后一个元素都不相等,那么肯定没有公共节点 return null; } cur1 = n > 0? pHead1 : pHead2;//谁长谁就变成cur1 cur2 = cur1 == pHead1 ? pHead2:pHead1;//谁短谁就是cur2 n = Math.abs(n);//如果为n<0需要变成正数 while(n > 0){ //使cur1移动到和cur2长度一样的位置处 n--; cur1 = cur1.next; } //此时,链表长度都是从同一长度出发,能够找到第一个公共节点 while(cur1!=cur2){ cur1 = cur1.next; cur2 = cur2.next; } return cur1; } module.exports = { FindFirstCommonNode : FindFirstCommonNode };