输入两个链表,找出它们的第一个公共节点。
思路
如果两个等长的链表,很容易就能找到公共节点。只需要从头开始遍历链表节点,第一个两个链表节点的地址一样就是结果。 所以,只要让两个链表变成等长的就可以了。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lengthA = length(headA);
int lengthB = length(headB);
int diff = Math.abs(lengthA - lengthB);
if (lengthB > lengthA) {
ListNode temp = headA;
headA = headB;
headB = temp;
}
for (int i = 0; i < diff; i++) {
headA = headA.next;
}
while (headA != null) {
if (headA == headB) {
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
private int length(ListNode head) {
int length = 0;
ListNode p = head;
while(p != null) {
length++;
p = p.next;
}
return length;
}
}
update20210324
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int len1 = length(headA);
int len2 = length(headB);
if (len2 > len1) {
ListNode temp = headA;
headA = headB;
headB = temp;
}
int diff = Math.abs(len1 - len2);
for (int i = 0; i < diff; i++) {
headA = headA.next;
}
while (headA != headB) {
headA = headA.next;
headB = headB.next;
}
return headA;
}
int length(ListNode list) {
ListNode p = list;
int len = 0;
while (p != null) {
len++;
p = p.next;
}
return len;
}
}
复杂度
时间复杂度:O(m+n) 空间复杂度:O(1)
硬广告
欢迎关注公众号:double6