您的位置:首页 > 其它

Intersection of Two Linked Lists

2016-09-05 09:47 260 查看
Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:
A:          a1 → a2
↘
c1 → c2 → c3
↗
B:     b1 → b2 → b3


begin to intersect at node c1.

Notes:
If the two linked lists have no intersection at all, return 
null
.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.
题意:查找两个链表的第一个公共节点

解题思路:公共节点以后的部分长度都是相等的,所以遍历链表两个链表求其长度,

遍历链表A,记录其长度lengthA,遍历链表B,记录其长度lengthB作差记为count。

让长的链表先走count步,然后两个链表再同时走,直到两个节点相同。

时间复杂度O(lengthA+lengthB),空间复杂度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) {
if(headA == null ||headB == null)return null;

int lengthA = 1;
int lengthB = 1;
ListNode curNodeA = headA;
ListNode curNodeB = headB;

//遍历链表A,求出链表A的长度
while (curNodeA.next != null) {
lengthA++;
curNodeA = curNodeA.next;
}
//遍历链表B,求出链表B的长度
while (curNodeB.next != null) {
lengthB++;
curNodeB = curNodeB .next;
}
//判断最后一个元素是否相等,若不相等,则说明没有交
if (curNodeA != curNodeB) {
return null;
}else {
int count = Math.abs(lengthA - lengthB);
//重新开始
curNodeA = headA;
curNodeB = headB;

if (lengthA <= lengthB) {
while (count > 0) {
curNodeB = curNodeB.next;
count-- ;
}
} else {
while (count > 0) {
curNodeA = curNodeA.next;
count--;
}

}
while (curNodeA != curNodeB) {
curNodeA = curNodeA.next;
curNodeB = curNodeB.next;

}
//如果找到相等的,那么返回curNodeA就是当前第一个相交的位置
//如果遍历到最后一个都一直不相等,那么返回的curNodeA是尾部的null
return curNodeA;
}
}
}
注意:最后只返回curNodeA就可以了  因为    //如果找到相等的,那么返回curNodeA就是当前第一个相交的位置
//如果遍历到最后一个都一直不相等,那么返回的curNodeA是尾部的null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: