标签:最大和 lis 复制 offer 二叉树的镜像 左旋转字符串 mic 逆序对 指针
重磅干货,第一时间送达两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。
思路一:两条相交的链表呈Y型。可以从两条链表尾部同时出发,最后一个相同的结点就是链表的第一个相同的结点。可以利用栈来实现。时间复杂度有O(m + n), 空间复杂度为O(m + n)
思路二:
思路一其实利用栈主要解决就是同时到达第一个结点的问题,需要有额外的空间。那么从链表头出发如何同时到达第一个相同的结点呢? 链表的长度相同就可以,其实就是走的结点数目相同。所以可以让其中长的链表先走几步,走多少步呢?走M-N步。(M>N,M为链表1长度,N为链表2长度)剩余的长度到短链表的长度相同。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, head1, head2):
if not head1 or not head2:
return None
p1, p2= head1, head2
length1 = length2 = 0
while p1:
length1 += 1
p1 = p1.next
while p2:
length2 += 1
p2 = p2.next
if length1 > length2:
while length1 - length2:
head1 = head1.next
length1 -= 1
else:
while length2 - length1:
head2 = head2.next
length2 -= 1
while head1 and head2:
if head1 is head2:
return head1
head1 = head1.next
head2 = head2.next
return None
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1==NULL||pHead2==NULL)return NULL;
//首先遍历两个链表获取长度
ListNode *pNode1=pHead1,*pNode2=pHead2;
int listLength1=0,listLength2=0;
while(pNode1!=NULL){
++listLength1;
pNode1=pNode1->next;
}
while(pNode2!=NULL){
++listLength2;
pNode2=pNode2->next;
}
//比较长度,长的先走dist步
pNode1=pHead1;
pNode2=pHead2;
if(listLength1>listLength2){
for(int i=0;i<listLength1-listLength2;i++){
pNode1=pNode1->next;
}
}
else if(listLength1<listLength2){
for(int i=0;i<listLength2-listLength1;i++){
pNode2=pNode2->next;
}
}
while(pNode1!=NULL&&pNode2!=NULL&&pNode1!=pNode2){
pNode1=pNode1->next;
pNode2=pNode2->next;
}
return pNode1;
}
};
后记
注:面试季来了,不管是作为面试者还是以后作为面试官,了解算法这门程序员之间的沟通方式都是非常必要的。找过工作的朋友应该都听说过《剑指offer》,虽然书中只有六十多道题目,但是道道都是经典。
如果是单纯的面试需求,剑指offer的优先级肯定是在Leetcode之前,总的说它有三个优点:
它的缺点是:
剑指offer刷题交流群
扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。
▲长按加群
每日算法题 | 剑指offer 链表专题 (10) 两个链表的第一个公共结点
标签:最大和 lis 复制 offer 二叉树的镜像 左旋转字符串 mic 逆序对 指针
原文地址:https://blog.51cto.com/15054042/2564459