卖萌的弱渣

I am stupid, I am hungry.

Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

Example:

The following two linked lists:

1
2
3
4
5
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.

Solution

  • Java: 把两条链跑两边,返回交点
(Intersection-of-Two-Linked-Lists.java) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 * 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;
        ListNode a = headA;
        ListNode b = headB;
        while(a!=b){
            if(a==null)
                a = headB;
            else
                a = a.next;

            if(b==null)
                b = headA;
            else
                b = b.next;
        }
        return a;
    }
}
  • Python
  • 挪动较长的list. 保证headA 和 headB到末尾距离相同

  • 同时挪动headA和headB,判断是否有重合

(Intersection-of-Two-Linked-Lists.py) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """

        # find lenA and lenB
        lenA = self.getsize(headA)
        lenB = self.getsize(headB)


        # find intersection
        if lenA<lenB:
            return self.getIntersectionNode(headB,headA)

        for i in range(lenA-lenB):
            headA = headA.next

        while headA and headB:
            if headA.val == headB.val:
                return headA
            headA = headA.next
            headB = headB.next
        return None

    def getsize(self, node):
        len = 0
        while node:
            len += 1
            node = node.next
        return len