LeetCode 160 :Intersection of Two Linked Lists

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.

分析:

找出两个链表的交点,有两种方法:

1)暴力法,

将链表A中的所有元素加入到Map中。

对链表B中得每一个元素,判断是不是在Map中,如果在,则是A和B的交叉点。如果都不是,则A和B没有交叉点。

该方法肯定不能满足题目中要求的O(n)和O(1)的时间、空间复杂度要求。

2)计算长度法。假设链表A和B相交,则交点及之后的部分长度是相同的,相差的是交点前的部分。计算A和B的长度差n,较长的那个先走N步,然后和较短的那个同时遍历。如果指针指向同一元素,则为交点,否则A和B 没有交点。该方法能够满足线性时间复杂度和常数空间复杂度的要求。

代码如下:

class Solution {
public:

    //计算链表长度
  int calcListLength(ListNode *head){
        int count = 0;
        while (head) {
            count++;
            head = head->next;
        }
        return count;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lengthA = calcListLength(headA);
        int lengthB = calcListLength(headB);
        ListNode *pA = headA, *pB = headB;
        //计算链表长度的差值,较长的先走N步
        int n = lengthA - lengthB;
        for(int i=0; i<abs(n); i++){
            if(n>0){
                pA = pA->next;
            }else{
                pB = pB ->next;
            }
        }
        //同时开始遍历,如相等则为交叉点
        while (pB && pA) {
            if (pB == pA) {
                return pB;
            }
            pB = pB->next;
            pA = pA ->next;
        }
        return NULL;

    }
};
时间: 2024-10-07 19:08:51

LeetCode 160 :Intersection of Two Linked Lists的相关文章

Leetcode 160:Intersection of Two Linked Lists

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 i

LeetCode OJ:Intersection of Two Linked Lists(两个链表的插入)

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. 找出第一个合并的节点的位置(或者说插入),注意复杂度为O(N),那么先遍历两个链

leetcode:Intersection of Two Linked Lists

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 i

LeetCode【160】Intersection of Two Linked Lists

For example, the following two linked lists: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 begin to intersect at node c1. 思路比较清晰,首先确定二者的长度并计算长度之差的绝对值dis,让较长链表先走dis步,然后两个指针一起走.如果两个指针相等,则返回,否则当指针达到NULL时,没有交点. AC代码如下: void getLength(ListNode *head , int& len)

Leetcode45:Intersection of Two Linked Lists

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 i

lintcode 中等题:Intersection of Two Linked Lists 两个链表的交叉

题目 两个链表的交叉 请写一个程序,找到两个单链表最开始的交叉节点. 样例 下列两个链表: A: a1 → a2 c1 → c2 → c3 B: b1 → b2 → b3 在节点 c1 开始交叉. 注意 如果两个链表没有交叉,返回null. 在返回结果后,两个链表仍须保持原有的结构. 可假定整个链表结构中没有循环. 挑战 需满足 O(n) 时间复杂度,且仅用 O(1) 内存. 解题 尝试用时间复杂度是O(NM),却没有解决,在这个博客看到根据两个链表的特性进行解决. 就如同上图,两个链表相交的部

leetCode 160. Intersection of Two Linked Lists 链表

160. Intersection of Two Linked Lists 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

[LeetCode] 160. Intersection of Two Linked Lists 解题思路

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 i

leetcode Intersection of Two Linked Lists python

Intersection of Two Linked Lists 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. python