leetcode相交链表(简单)

在VS 2022上可以运行但是不知道为什么在leetcode上无法运行,希望有明白的大佬可以指点我一下。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef struct Node {
    int val;
    struct Node* next;
}Node, * ListNode;
ListNode LinkListInit();
bool createTail(ListNode L);
bool MakeLoop(ListNode L, int i);
bool hasCycle(ListNode L);
void printLinkList(ListNode L);
ListNode LinkListInit() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请结点空间 
    if (L == NULL) { //判断是否有足够的内存空间 
        printf("申请内存空间失败\n");
    }
    L->next = NULL;//将next设置为NULL,初始长度为0的单链表 
    return L;
}
//输入一个链表的值
bool createTail(ListNode L) {
    int x;
    Node* s, * r = L;
    printf("输入一个链表的值:\n");
    scanf("%d", &x);
    while (x != 9999) {
        s = (Node*)malloc(sizeof(Node));
        s->val = x;
        r->next = s;
        r = s;
        scanf("%d", &x);
    }
    r->next = NULL;
    return true;
}

//链表长度
int getLen(ListNode L) {
    int len = 0;
    ListNode R;
    if (L->next == NULL)//头指针为空,则链表不包含元素,返回0
        return 0;
    else {
        R = L->next;
        while (R != NULL) {
            R = R->next;
            len++;
        }
    }
    return len;
}


//按值查找结点值
int GetSize(ListNode L, int num) {
    Node* p = L;
    int j = 0;
    while (p != NULL && p->val != num) {
        p = p->next;
        j++;
    }
    return j;
}

//按序号查找结点值
Node* GetElem(ListNode L, int i) {
    int j = 1, temp;
    Node* p = L->next;
    if (i == 0)
        return L;//若i = 0,则返回头结点
    if (i < 1) {
        return NULL;//若i无效,则返回NULL
    }
    while (p && j < i) {//查找到第i个结点
        p = p->next;
        j++;
    }
    return p;
}

ListNode getIntersectionNode(ListNode L1, ListNode L2) {
    Node * p, * q,*s,*r1,*r2;//s为第一个相同的结点
    ListNode R1, R2,T1,T2,M = NULL;
    int temp = 0,flag = 0,L1Size = 0,L2Size = 0,len1 = 0,len2 = 0;
    len1 = getLen(L1);
    len2 = getLen(L2);
    p = L1->next;
    q = L2->next;
    R1 = L1;
    R2 = L2;
    T1 = LinkListInit();
    T2 = LinkListInit();
    s = (Node*)malloc(sizeof(Node));
    if (len1 == 1 && len2 == 1) {
        if (p->val != q->val)
            return T2;
        else
            return L1;
    }
    if (len1 == 1 && len2 != 1 || len2 == 1 && len1 != 1) {
        for (; p; p = p->next) {
            for (; q; q = q->next) {
                if (p->val == q->val) {
                    temp = p->val;
                    flag = 1;
                }
            }
            if (flag == 1) {
                break;
            }
            q = L2->next;
        }
    }
    for (; p; p = p->next) {
        for (; q; q = q->next) {
            if ((p->val == q->val) && (p->next->val == q->next->val)) {
                temp = p->val;
                flag = 1;
            }
        }
        if (flag == 1) {
            break;
        }
        q = L2->next;
    }
    L1Size = GetSize(L1, temp);
    L2Size = GetSize(L2, temp);
    R1 = GetElem(L1, L1Size-1);
    R2 = GetElem(L2, L2Size-1);
    r1 = R1->next;
    r2 = R2->next;
    T1 = R1;
    while (r1 != NULL && r2 != NULL) {
        if (r1->val != r2->val) {
            return T2;
        }
        r1 = r1->next;
        r2 = r2->next;
    }
    return T1;
}

//输出链表
void printLinkList(ListNode L)
{
    ListNode p;
    p = L->next;
    if ( p== NULL) {
        printf("null");
    }
    while (p)
    {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}


int main(void) {
    ListNode L1, L2,R,L;
    L1 = LinkListInit();
    L2 = LinkListInit();
    L = LinkListInit();
    R = LinkListInit();
    printf("输入第一个链表:\n");
    createTail(L1);
    printf("输入第二个链表:\n");
    createTail(L2);
    L = getIntersectionNode(L1, L2);
    printLinkList(L);
    return 0;
}

下面是在VS 2022上的运行效果图,当有相交的链表时,输出相交链表

 

 

没有时输出null

 

 leetcode上面的报错,说是我例子一没有通过,但是我感觉是他的样例有问题。。。

预期结果应该是1而不是8吧 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值