Bird
Raised Fist0
DSA Cprogramming

Intersection Point of Two Linked Lists in DSA C

Choose your learning style10 modes available
Mental Model
Two linked lists may share some nodes at the end. The intersection point is the first shared node. We find it by aligning the lists and moving together.
Analogy: Imagine two roads merging into one. Before merging, they are separate paths. The intersection point is where they join and share the same path forward.
List A: 1 -> 2 -> 3 -> 4 -> 5 -> null
                      ↑
List B:       9 -> 4 -> 5 -> null
                      ↑
Intersection at node with value 4
Dry Run Walkthrough
Input: List A: 1->2->3->4->5, List B: 9->4->5 (4 and 5 are shared nodes)
Goal: Find the first node where both lists intersect (node with value 4).
Step 1: Calculate lengths: lenA=5, lenB=3
List A: 1 -> 2 -> 3 -> 4 -> 5 -> null
List B: 9 -> 4 -> 5 -> null
Why: Knowing lengths helps align both lists to same remaining length.
Step 2: Advance headA by 2 nodes to align with headB
List A: 3 -> 4 -> 5 -> null
List B: 9 -> 4 -> 5 -> null
Why: Skip extra nodes in longer list so both have equal nodes left.
Step 3: Move both heads forward together until they meet
headA=3, headB=9 (not equal)
headA=4, headB=4 (equal)
Why: First common node is intersection point.
Result:
4 -> 5 -> null is the intersection starting at node with value 4
Annotated Code
DSA C
#include <stdio.h>
#include <stdlib.h>

// Node structure
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// Create new node
Node* newNode(int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    return node;
}

// Get length of linked list
int getLength(Node* head) {
    int length = 0;
    while (head) {
        length++;
        head = head->next;
    }
    return length;
}

// Find intersection point
Node* getIntersectionNode(Node* headA, Node* headB) {
    int lenA = getLength(headA);
    int lenB = getLength(headB);

    // Align heads
    while (lenA > lenB) {
        headA = headA->next; // advance longer list
        lenA--;
    }
    while (lenB > lenA) {
        headB = headB->next; // advance longer list
        lenB--;
    }

    // Move together
    while (headA && headB) {
        if (headA == headB) {
            return headA; // intersection found
        }
        headA = headA->next;
        headB = headB->next;
    }
    return NULL; // no intersection
}

// Print list from given node
void printList(Node* head) {
    while (head) {
        printf("%d", head->data);
        if (head->next) printf(" -> ");
        head = head->next;
    }
    printf(" -> null\n");
}

int main() {
    // Create shared nodes
    Node* node4 = newNode(4);
    node4->next = newNode(5);

    // List A: 1->2->3->4->5
    Node* headA = newNode(1);
    headA->next = newNode(2);
    headA->next->next = newNode(3);
    headA->next->next->next = node4;

    // List B: 9->4->5
    Node* headB = newNode(9);
    headB->next = node4;

    Node* intersection = getIntersectionNode(headA, headB);
    if (intersection) {
        printf("Intersection at node with value: %d\n", intersection->data);
        printf("Intersection list: ");
        printList(intersection);
    } else {
        printf("No intersection found\n");
    }
    return 0;
}
int lenA = getLength(headA); int lenB = getLength(headB);
Calculate lengths of both lists to know difference
while (lenA > lenB) { headA = headA->next; lenA--; }
Advance longer list head to align both lists
while (lenB > lenA) { headB = headB->next; lenB--; }
Advance longer list head to align both lists
while (headA && headB) { if (headA == headB) return headA; headA = headA->next; headB = headB->next; }
Move both pointers together until intersection or end
OutputSuccess
Intersection at node with value: 4 Intersection list: 4 -> 5 -> null
Complexity Analysis
Time: O(m + n) because we traverse both lists to get lengths and then traverse aligned parts once
Space: O(1) because we use only pointers and counters, no extra data structures
vs Alternative: Naive approach compares every node of one list with every node of other (O(m*n)), this method is efficient by aligning lengths first
Edge Cases
No intersection (two separate lists)
Function returns NULL and prints 'No intersection found'
DSA C
return NULL; // no intersection
One or both lists empty
Function returns NULL immediately as no nodes to compare
DSA C
while (headA && headB) { ... }
Intersection at head (both lists start at same node)
Function returns head immediately as intersection
DSA C
if (headA == headB) return headA;
When to Use This Pattern
When you see two linked lists and need to find if they share nodes, use the intersection pattern by aligning lengths and moving pointers together.
Common Mistakes
Mistake: Comparing node values instead of node addresses for intersection
Fix: Compare node pointers (addresses) to find actual shared nodes, not just values
Summary
Finds the first shared node where two linked lists intersect.
Use when two lists may merge and you want to find the merge point.
Align lists by length difference, then move pointers together to find intersection.

Practice

(1/5)
1. What does the term intersection point of two linked lists mean?
easy
A. The node where both linked lists have the same value but different references
B. The node where both linked lists share the same reference
C. The first node of the longer linked list
D. The last node of the shorter linked list

Solution

  1. Step 1: Understand linked list nodes and references

    Each node in a linked list has a reference (address) to the next node. Two lists intersect if they share the same node reference, not just the same value.
  2. Step 2: Define intersection point

    The intersection point is the first node where both lists point to the exact same node object in memory.
  3. Final Answer:

    The node where both linked lists share the same reference -> Option B
  4. Quick Check:

    Intersection means shared node reference [OK]
Hint: Intersection means same node object, not just same value [OK]
Common Mistakes:
  • Confusing same value with same node reference
  • Thinking intersection is based on node values
  • Assuming intersection is at list ends
2. Which of the following C code snippets correctly declares a node structure for a singly linked list used to find intersection?
easy
A. struct Node { int data; struct Node next; };
B. struct Node { int data; Node* next; };
C. typedef struct { int data; struct Node* next; } Node;
D. typedef struct Node { int data; struct Node* next; } Node;

Solution

  1. Step 1: Understand correct struct declaration

    In C, to declare a linked list node, you define a struct with data and a pointer to the same struct type.
  2. Step 2: Check each option

    typedef struct Node { int data; struct Node* next; } Node; correctly uses typedef and struct Node with a pointer to struct Node. struct Node { int data; Node* next; }; misses typedef and uses Node* without struct keyword. typedef struct { int data; struct Node* next; } Node; misses struct name. struct Node { int data; struct Node next; }; incorrectly uses struct Node next (not a pointer).
  3. Final Answer:

    typedef struct Node { int data; struct Node* next; } Node; -> Option D
  4. Quick Check:

    Correct struct with pointer to same struct [OK]
Hint: Use 'struct Node* next;' inside struct for pointer to next node [OK]
Common Mistakes:
  • Forgetting 'struct' keyword before pointer type
  • Using struct variable instead of pointer for next
  • Missing typedef or struct name
3. Given the following code snippet to find the intersection point of two linked lists, what will be the output?
Node* getIntersectionNode(Node* headA, Node* headB) {
    Node *a = headA, *b = headB;
    while (a != b) {
        a = (a == NULL) ? headB : a->next;
        b = (b == NULL) ? headA : b->next;
    }
    return a;
}

// Lists:
// List A: 1 -> 2 -> 3 \
//                      6 -> 7 -> NULL
// List B:       4 -> 5 /

// Intersection at node with value 6
Node* result = getIntersectionNode(headA, headB);
printf("%d", result->data);
medium
A. 3
B. 5
C. 6
D. NULL

Solution

  1. Step 1: Understand the two-pointer approach

    Two pointers traverse each list; when reaching end, switch to other list head. They meet at intersection or NULL if none.
  2. Step 2: Trace pointers on given lists

    Lists intersect at node with value 6. Pointers will meet there after switching lists.
  3. Final Answer:

    6 -> Option C
  4. Quick Check:

    Two-pointer meet at intersection node value 6 [OK]
Hint: Two pointers switch lists to align lengths and meet at intersection [OK]
Common Mistakes:
  • Assuming pointers meet at first node
  • Not switching pointers to other list head
  • Confusing node value with pointer address
4. Identify the bug in the following code snippet intended to find the intersection point of two linked lists:
Node* getIntersectionNode(Node* headA, Node* headB) {
    Node *a = headA, *b = headB;
    while (a != b) {
        if (a == NULL || b == NULL) {
            a = headB;
            b = headA;
        } else {
            a = a->next;
            b = b->next;
        }
    }
    return a;
}
medium
A. The loop may run infinitely if no intersection exists
B. Pointers should not switch lists when NULL
C. The function does not handle empty lists
D. The comparison should be 'a->data == b->data' instead of 'a != b'

Solution

  1. Step 1: Analyze loop termination condition

    The loop ends when pointers a and b are equal (same node or NULL).
  2. Step 2: Check pointer switching logic

    When a or b is NULL, they switch to other list head. But if no intersection, pointers cycle indefinitely without becoming equal.
  3. Final Answer:

    The loop may run infinitely if no intersection exists -> Option A
  4. Quick Check:

    Loop lacks proper NULL check, causing infinite loop [OK]
Hint: Add explicit NULL check to break loop if no intersection [OK]
Common Mistakes:
  • Assuming pointers always meet
  • Comparing node data instead of node pointers
  • Not handling empty list inputs
5. You have two singly linked lists that may or may not intersect. Write a function to find the intersection point efficiently. Which approach below is best and why? A) Use two pointers starting at heads, switch to other list when reaching end, until they meet. B) Use nested loops to compare every node of list A with every node of list B. C) Store all nodes of list A in a hash set, then check nodes of list B for presence. D) Reverse both lists and compare nodes from the start until they differ.
hard
A. Two-pointer switching approach; O(n) time, O(1) space
B. Nested loops; O(n*m) time, O(1) space
C. Hash set approach; O(n+m) time, O(n) space
D. Reverse lists; modifies input and O(n) time

Solution

  1. Step 1: Evaluate time and space complexity of each approach

    Two-pointer switching approach; O(n) time, O(1) space uses two pointers switching lists, runs in linear time and constant space. Nested loops; O(n*m) time, O(1) space is nested loops, very slow. Hash set approach; O(n+m) time, O(n) space uses extra space for hash set. Reverse lists; modifies input and O(n) time modifies lists, which is not ideal.
  2. Step 2: Choose best approach for efficiency and safety

    Two-pointer switching approach; O(n) time, O(1) space is best because it is efficient (O(n)) and does not use extra space or modify lists.
  3. Final Answer:

    Two-pointer switching approach; O(n) time, O(1) space -> Option A
  4. Quick Check:

    Two-pointer method is optimal for intersection detection [OK]
Hint: Two-pointer switch method is fastest and uses no extra space [OK]
Common Mistakes:
  • Choosing nested loops causing slow performance
  • Using extra memory unnecessarily
  • Modifying input lists causing side effects
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard