leetcode160题相交链表

cs 复制代码
#include <stdio.h>
#include <stdlib.h> 
struct Node{
	int data;
	struct Node* next;
};

int List_length(struct Node* head)
{
	int length = 0;
	while(head != NULL)
	{
		length ++;
		head = head->next;
	}
	return length;
}

struct Node* move_pointer(struct Node* head, int count)
{
	int i;
	for(i = 0; i < count; i ++)
	{
		head = head->next;
	}
	return head;
}

struct Node *getIntersectionNode(struct Node* headA, struct Node* headB)
{
	int lengthA = List_length(headA);
	int lengthB = List_length(headB);
	
	if(lengthA > lengthB){
		headA = move_pointer(headA, lengthA - lengthB);
	}else{
		headB = move_pointer(headB, lengthB - lengthA);
	}
	
	struct Node* result = NULL;
	while(headA != NULL && headB != NULL)
	{
		if(headA == headB){
			result = headA;
			break;
		}
		headA = headA->next;
		headB = headB->next;
	}
	return result;
}

void freeList(struct Node* head) {
    struct Node* temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

void Print(struct Node* head)
{
	struct Node *temp = head;
	while(temp != NULL){
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
}



int main()
{
    // 创建示例链表
    struct Node* headA = (struct Node*)malloc(sizeof(struct Node));
    struct Node* headB = (struct Node*)malloc(sizeof(struct Node));
    struct Node* intersection = (struct Node*)malloc(sizeof(struct Node));
    
    // 初始化链表A:4 -> 1 -> 8 -> 4 -> 5
    headA->data = 4;
    headA->next = (struct Node*)malloc(sizeof(struct Node));
    headA->next->data = 1;
    headA->next->next = intersection;
    
    // 初始化链表B:5 -> 6 -> 1 -> 8 -> 4 ->5
    headB->data = 5;
    headB->next = (struct Node*)malloc(sizeof(struct Node));
    headB->next->data = 6;
    headB->next->next = (struct Node*)malloc(sizeof(struct Node));
    headB->next->next->data = 1;
    headB->next->next->next = intersection;
    
    // 初始化相交节点
    intersection->data = 8;
    intersection->next = (struct Node*)malloc(sizeof(struct Node));
    intersection->next->data = 4;
    intersection->next->next = (struct Node*)malloc(sizeof(struct Node));
    intersection->next->next->data = 5;
    intersection->next->next->next = NULL;
    
    Print(headA);
    Print(headB);
    
    
 	// 查找相交节点
    struct Node* result = getIntersectionNode(headA, headB);
    
    if (result) {
        printf("相交节点的数据为:%d\n", result->data);
    } else {
        printf("没有相交节点\n");
    }
    
    freeList(headA);
    freeList(headB); // 释放链表B的内存
    freeList(intersection); // 释放相交部分的内存
    
    return 0;
     
    
}
相关推荐
莹莹学编程—成长记25 分钟前
list基础用法
数据结构·list
清幽竹客35 分钟前
redis数据结构-09 (ZADD、ZRANGE、ZRANK)
数据结构·数据库·redis
葵花日记1 小时前
数据结构——二叉树
c语言·数据结构
越城2 小时前
数据结构中的栈与队列:原理、实现与应用
c语言·数据结构·算法
似水এ᭄往昔2 小时前
【数据结构】——栈和队列OJ
c语言·数据结构·c++
双叶8363 小时前
(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
c语言·开发语言·数据结构·c++
真的想上岸啊3 小时前
c语言第一个小游戏:贪吃蛇小游戏05
c语言·算法·链表
元亓亓亓3 小时前
LeetCode热题100--206.反转链表--简单
算法·leetcode·链表
想睡hhh4 小时前
c++进阶——哈希表的实现
开发语言·数据结构·c++·散列表·哈希
打鱼又晒网6 小时前
数据类型:List
数据结构·list