#include <stdio.h> #include <stdlib.h>typedef struct linknode{struct linknode* next; int data;} linklist;/* Description: The single-linked list of all the leading nodes *//* create a linked list */void createlinklist (linklist* head, int* A, int n) {int i = 0; linknode* node = NULL; while (I < n) {node = new Linknode; Node->next = head->next; Node->data = A[i]; Head->next = node; i++; }}/* gets the length of the list */int getlenoflist (linklist* head) {int i = 0; linknode* node = head; while (node->next! = NULL) {i++; node = node->next; } return i;} /* Get the list of K nodes */linknode* Getknode (linklist* head, int K) {linknode* p = head; while ((P->next!=null) && (k>0)) {p = p->next; k--; } return (k>0)? Null:p;} /* Note that this function will find a linked list without a ring, if the band needs to reconsider *//* reference: http://blog.csdn.net/xiaodeyu2010xiao/article/details/42460203*//* Note: To change the blog should be omitted there is also a situation in the case of looping, if it is handled as follows: Linked list a:o->o->o->o->o--> ^ ^ | | | | | ------| | <----O<-o<-o<-o: The list B method is actually very similar: to determine whether a ring, find looping node is the same, if the same, then according to the judgment, take two linked list length, let long first go n-m (N,m are two linked list length) and then go forward , if the node is equal and not the ring node exits, find the first junction of the intersection *//* Description: The change function can continue to optimize, if you do not want to directly determine whether the last node is equal exit */bool Findfirstcommonnode (linklist* l, Linklist*s, linknode* &node) {int n = getlenoflist (l);/* Gets the list length */int m = getlenoflist (s);/* Gets the list length */Linknode * p; linknode* Q; /* Find the starting point */if (n > m) {p = Getknode (l, n-m) respectively; Q = s; } else {p = Getknode (S, m-n); Q = l; }/* Go down to find the starting point */while (P!=null && q!=null) {if (p = = q) {node = p; return true; } p = p->next; Q = q->next; } return false;} /* Add the S-linked footer node to the K-position of the L-linked list */bool Appendknode (linklist* L, linklist* s, int K) {linknode* lastnode = s; linknode* node = l; while (lastnode->next! = NULL) {lastnode = lastnode->next; } while (Node-> next!=null && (k>0) {node = node->next; k--; } if (K > 0) {return false; } lastnode->next = node; return true;} /* Print List */void printlinklist (linklist* head) {linknode* node = head->next; while (node! = NULL) {printf ("%d\t", node->data); node = node->next; } printf ("\ n");} int main () {/* Creates a linked list */linklist L = {0}; linknode* node = NULL; int a[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; Createlinklist (&l, A, 9); Printlinklist (&L); /* Create a linked list */linklist s = {0}; int b[] = {15, 14, 13, 12}; Createlinklist (&s, B, 4); Printlinklist (&s); Findfirstcommonnode (&l, &s, node); if (node! = NULL) {printf ("First common node%d\n", Node->data); } else {printf ("NO COMMON node\n"); }/* Adds an S-linked footer node to the K-position of the L-linked list */Appendknode (&l, &s, 3); Printlinklist (&s); FindfirstcommonNode (&l, &s, node); if (node! = NULL) {printf ("First common node%d\n", Node->data); } return 0;}
Determines whether the two linked lists intersect if the intersection finds the first point of intersection