1.题目描述
输入两个链表,找出它们的第一个公共结点。
2.算法描述
1.得到两个链表的长度。
2.让更长的链表的头指针先走两者长度的差值步。(此时两个头指针后面的长度是一样的)
3.让两个头指针同时向后移动,如果出现两个头指针相同,则是第一个公共结点,直接返回;如果头指针移动完也没有遇到两个头指针相同,则返回null。
3.代码描述
3.1.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) {
int size1 = getSize(pHead1);
int size2 = getSize(pHead2);
if(size1>size2)
pHead1 = walkStep(pHead1, size1-size2);
else
pHead2 = walkStep(pHead2, size2-size1);
while(pHead1!=null){
if(pHead1 == pHead2)
return pHead1;
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return null;
}
private int getSize(ListNode head){
int size = 0;
while(head!=null){
size++;
head = head.next;
}
return size;
}
private ListNode walkStep(ListNode head, int step){
while(step!=0){
step--;
head = head.next;
}
return head;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
size1 = self.get_size(pHead1)
size2 = self.get_size(pHead2)
if size1>size2:
pHead1 = self.walk_step(pHead1, size1-size2)
else:
pHead2 = self.walk_step(pHead2, size2-size1)
while pHead1:
if pHead1 == pHead2:
return pHead1
pHead1 = pHead1.next
pHead2 = pHead2.next
return None
def get_size(self, head):
size = 0
while head:
head = head.next
size += 1
return size
def walk_step(self, head, step):
while step:
head = head.next
step -= 1
return head