想法一
一一对比,假设用a1和链表B中所有节点比较,找不到,再用a2……直到A最后比较完
时间复杂度:O(N*M) 空间复杂度:O(1)
想法二
算出两个链表长度,让长链表的头指针走差距步,然后两个链表指针同时边走边比对
先用tail1和tail2指针找尾,算出各自链表的长度
再比较尾节点的地址是否相等,如果相等,则链表相交,如果不相等,返回NULL
注意:比较的是两个节点的地址,而不是存储的数值
接着,创建长表头和短表头指针 ,让longlist指针先走差距步
最后,两个指针同时向后走,一旦地址相同则停下,返回相交节点的地址
时间复杂度:O(N) 空间复杂度:O(1)
完整代码如下:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *tail1 = headA, *tail2 = headB; int len1 = 1, len2 = 1; while (tail1->next) { tail1 = tail1->next; len1++; } while (tail2->next) { tail2 = tail2->next; len2++; } if (tail1 != tail2) { return NULL; } int gap = abs(len1 - len2); struct ListNode *longlist = headA, *shortlist = headB; if (len1 < len2) { longlist = headB; shortlist = headA; } while (gap--) { longlist = longlist->next; } while (longlist != shortlist) { longlist = longlist->next; shortlist = shortlist->next; } return longlist; }