两个链表中第一个公共节点
题解
-
快慢指针
- 算法思想
- 先遍历一遍链表,分别记录链表的长度,记为 alength、blength
- 让长的链表先走(abs(alength-blength))
- 然后两个链表同时向后走,直到两个链表同时到达同一个节点
- 复杂度分析
- 时间复杂度O(m+n)
- 空间复杂度 O(1)
/** * 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 alength = 0,blength = 0; ListNode a = headA,b = headB; while(a != null){ alength++; a = a.next; } while(b != null){ blength++; b = b.next; } if(alength > blength){ for(int i = 0;i < alength - blength;i++){ headA = headA.next; } }else{ for(int i = 0; i < blength - alength;i++){ headB = headB.next; } } while(headA != headB && headA != null && headB != null){ headA = headA.next; headB = headB.next; } return headA ==null || headB == null ? null : headA; } }
- 算法思想
-
巧妙
-
算法思想
- 我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。这样,当它们相遇时,所指向的结点就是第一个公共结点。
- 见下图(当a,b没有交点时,走 m+n 步之后都 为 null)
-
复杂度分析
- 时间复杂度 O(n+m)
- 空降复杂度 O(1)
public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) return null; ListNode node1 = headA, node2 = headB; while (node1 != node2) { node1 = node1 == null ? headB : node1.next; node2 = node2 == null ? headA : node2.next; } //当两个链表没有交点的时候回同时走到 null,此时退出 return node1; }
-
总结
- 巧妙的想法看看就好
- 链表时刻想起可以使用快慢指针